1. 程式人生 > >Codeforces Round #375 (Div. 2) D - Lakes in Berland dfs+貪心

Codeforces Round #375 (Div. 2) D - Lakes in Berland dfs+貪心

本場詳細題解見:https://blog.csdn.net/xiang_6/article/details/83549528

題意&思路見上述連結

 

 

#include<bits/stdc++.h>

using namespace std;

#define out fflush(stdout)
#define fast ios::sync_with_stdio(0),cin.tie(0);

#define FI first
#define SE second

typedef long long ll;
typedef pair<int,int> P;

const int maxn = 50 + 7;
const int INF = 0x3f3f3f3f;


int n, m, k;
char s[maxn][maxn];
int f[maxn][maxn] = {0};

int id = 1, cnt;
bool ok;
vector<P> vec;

int dx[5] = {0, 0, 1, -1};
int dy[5] = {1, -1, 0, 0};

void dfs(int x, int y) {
    if(x == 1 || x == n || y == 1 || y == m) ok = false;
    cnt++;
    f[x][y] = id;
    for(int i = 0; i < 4; ++i) {
        int nx = x + dx[i], ny = y + dy[i];
        if(nx >= 1 && nx <= n && ny >= 1 && ny <= m && s[nx][ny] != '*' && !f[nx][ny]) {
            dfs(nx, ny);
        }
    }
}

int main() {
    scanf("%d%d%d", &n, &m, &k);
    for(int i = 1; i <= n; ++i) {
        scanf("%s", s[i]+1);
    }

    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= m; ++j) {
            if(f[i][j]) continue;
            if(s[i][j] == '*') continue;
            ok = true;
            cnt = 0;
            dfs(i, j);
            if(ok) vec.push_back(P(cnt, id));
            id++;
        }
    }


    sort(vec.begin(), vec.end());
    int t = (int)vec.size() - k;
    int ans = 0;
    for(int i_ = 0; i_ < t; ++i_) {
        ans += vec[i_].FI;
        int t = vec[i_].SE;
        for(int i = 1; i <= n; ++i) {
            for(int j = 1; j <= m; ++j) {
                if(f[i][j] == t) f[i][j] = -1;
            }
        }
    }
    printf("%d\n", ans);
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= m; ++j) {
            if(f[i][j] == -1) printf("*");
            else printf("%c", s[i][j]);
        }
        puts("");
    }

//    for(auto i : vec) {
//        cout << i.FI << "  " << i.SE <<endl;
//    }

    return 0;
}