1600*A. Maze(DFS)

Problem - 377A - Codeforces

1600*A. Maze(DFS)_第1张图片

1600*A. Maze(DFS)_第2张图片

解析:

        对于正向思考比较复杂的题目,我们可以反向思考。

        由于最后剩余的 “ . ” 必须相连,所以我们将所有  “ . ” 全部换成 “ X ”,然后从其中DFS一个联通的“ X ”反向换成 “ . ”即可。

#include
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<

你可能感兴趣的:(codeforces,深度优先,算法,c++,图论,开发语言,c语言)