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

来源:互联网 发布:韩版男装淘宝店有哪些 编辑:程序博客网 时间:2024/05/22 04:39

题目链接: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 longusing 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;}


0 0
原创粉丝点击