Codeforces Round #222 (Div. 1) Maze —— dfs(连通块)

时间:2023-03-09 03:49:28
Codeforces Round #222 (Div. 1) Maze —— dfs(连通块)

题目链接:http://codeforces.com/problemset/problem/377/A

题解:

有tot个空格(输入时统计),把其中k个空格变为wall,问怎么变才能使得剩下的空格依然为连通的。把问题反过来,其实就是求tot-k的连通图。dfs:在搜索过的空格中做个标记,同时更新连通个数。

代码如下:

 #include<cstdio>//hdu3183 CodeForces 377A dfs
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL long long using namespace std; int n,m,k,sum,vis[][],path[][];
char maze[][]; int dfs(int i, int j)
{
if(sum==k) return ;
if(i< || i>n || j< || j>m) return ;
if(maze[i][j]!='.' || vis[i][j]) return ; sum++;
vis[i][j] = ;
path[i][j] = ;
if(dfs(i-,j)) return ;
if(dfs(i,j-)) return ;
if(dfs(i+,j)) return ;
if(dfs(i,j+)) return ;
} int main()
{
scanf("%d%d%d",&n,&m,&k);
k = -k;
for(int i = ; i<=n; i++)
{
getchar();
for(int j = ; j<=m; j++)
{
scanf("%c",&maze[i][j]);
if(maze[i][j]=='.') k++;
}
} int B = ;
memset(vis,,sizeof(vis));
for(int i = ; !B && i<=n; i++)
for(int j = ; j<=m; j++)
{
if(maze[i][j]=='.' && !vis[i][j])
{
sum = ;
memset(path,,sizeof(path));
if(dfs(i,j))
{
B = ;//双重循环,要加多个判断
break;
}
}
} for(int i = ; i<=n; i++)
for(int j = ; j<=m; j++)
{
if(maze[i][j]=='.')
{
if(path[i][j]) putchar('.');
else putchar('X');
} else putchar(maze[i][j]);
if(j==m) putchar('\n');
}
return ;
}