Codeforces Round #375 (Div. 2) D - Lakes in Berland dfs+貪心
阿新 • • 發佈:2018-11-13
本場詳細題解見: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; }