Codeforces Round #222 (Div. 1) Maze —— dfs(连通块)
2017-04-02 21:30
453 查看
题目链接: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[505][505],path[505][505];
char maze[505][505];
int dfs(int i, int j)
{
if(sum==k) return 1;
if(i<1 || i>n || j<1 || j>m) return 0;
if(maze[i][j]!='.' || vis[i][j]) return 0;
sum++;
vis[i][j] = 1;
path[i][j] = 1;
if(dfs(i-1,j)) return 1;
if(dfs(i,j-1)) return 1;
if(dfs(i+1,j)) return 1;
if(dfs(i,j+1)) return 1;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
k = -k;
for(int i = 1; i<=n; i++)
{
getchar();
for(int j = 1; j<=m; j++)
{
scanf("%c",&maze[i][j]);
if(maze[i][j]=='.') k++;
}
}
int B = 0;
memset(vis,0,sizeof(vis));
for(int i = 1; !B && i<=n; i++)
for(int j = 1; j<=m; j++)
{
if(maze[i][j]=='.' && !vis[i][j])
{
sum = 0;
memset(path,0,sizeof(path));
if(dfs(i,j))
{
B = 1;//双重循环,要加多个判断
break;
}
}
}
for(int i = 1; i<=n; i++)
for(int j = 1; 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 0;
}
题解:
有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[505][505],path[505][505];
char maze[505][505];
int dfs(int i, int j)
{
if(sum==k) return 1;
if(i<1 || i>n || j<1 || j>m) return 0;
if(maze[i][j]!='.' || vis[i][j]) return 0;
sum++;
vis[i][j] = 1;
path[i][j] = 1;
if(dfs(i-1,j)) return 1;
if(dfs(i,j-1)) return 1;
if(dfs(i+1,j)) return 1;
if(dfs(i,j+1)) return 1;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
k = -k;
for(int i = 1; i<=n; i++)
{
getchar();
for(int j = 1; j<=m; j++)
{
scanf("%c",&maze[i][j]);
if(maze[i][j]=='.') k++;
}
}
int B = 0;
memset(vis,0,sizeof(vis));
for(int i = 1; !B && i<=n; i++)
for(int j = 1; j<=m; j++)
{
if(maze[i][j]=='.' && !vis[i][j])
{
sum = 0;
memset(path,0,sizeof(path));
if(dfs(i,j))
{
B = 1;//双重循环,要加多个判断
break;
}
}
}
for(int i = 1; i<=n; i++)
for(int j = 1; 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 0;
}
相关文章推荐
- 【Codeforces Round 328 (Div 2)D】【树的直径 树的重心 贪心 两次dfs都找最小编号最远点】Super M 经过树上所有重要点的最小距离
- Codeforces Round #428 (Div. 2) C. Journey(dfs deep
- Codeforces Round #267 (Div. 2)D(DFS+单词hash+简单DP)
- Codeforces Round #407 (Div. 2)-E-The Great Mixing-滚动数组或者dfs
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree dfs+set
- Codeforces Round #447 (Div. 2) D. Ralph And His Tour in Binary Country(dfs)
- Codeforces Round #428 (Div. 2) C. Journey(dfs deep
- Codeforces Round #263 (Div. 1) B. Appleman and Tree(给一棵树,每个点为白色或黑色,切断一些边,使得每个连通块有且仅有一个黑点,问划分方案数。)
- Codeforces Round #222 (Div. 2)---A. Playing with Dice
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree dfs+set
- Codeforces Round #199 (Div. 2) E. Xenia and Tree (非正规解法 分情况dfs)
- Codeforces Round #336 (Div. 2) 608D Zuma(dfs+dp)
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree dfs+set
- Codeforces Round #108 (Div. 2)——状态压缩DP+spfa+dfs——Garden
- Codeforces Round #383 (Div. 2)C. Arpa's loud Owf and Mehrdad's evil plan(dfs&lcm)
- Codeforces Round #360 (Div. 2) -- C. NP-Hard Problem (DFS二分图染色法)
- Codeforces Round #268 (Div. 1)B(dfs)
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree dfs+set
- Codeforces Round #398 (Div. 2) -- C. Garland (dfs)
- Codeforces Round #459 (Div. 2)-D(dfs暴力)