Problem - 377A - Codeforces
解析:
对于正向思考比较复杂的题目,我们可以反向思考。
由于最后剩余的 “ . ” 必须相连,所以我们将所有 “ . ” 全部换成 “ X ”,然后从其中DFS一个联通的“ X ”反向换成 “ . ”即可。
#include<bits/stdc++.h>
using namespace std;
const int N=510;
int n,m,k;
int cnt,res,p;
char a[N][N],vis[N][N];
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int check(int x,int y){return x>0&&y>0&&x<=n&&y<=m;
}
void dfs(int x,int y){if(p>=res) return;a[x][y]='.';p++;for(int i=0;i<4;i++){int dx=x+dir[i][0];int dy=y+dir[i][1];if(check(dx,dy)&&!vis[dx][dy]&&a[dx][dy]=='X'){vis[dx][dy]=1;dfs(dx,dy);}}
}
int main(){scanf("%d%d%d",&n,&m,&k);int sx=-1,sy;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];if(a[i][j]=='.'){if(sx==-1) sx=i,sy=j;cnt++;a[i][j]='X';}}}res=cnt-k; //计算剩余 vis[sx][sy]=1;dfs(sx,sy);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cout<<a[i][j];}cout<<endl;}return 0;
}