HDU 6113 度度熊的01世界 (暴力dfs)

来源:互联网 发布:8080端口如何开启 编辑:程序博客网 时间:2024/05/22 11:53

思路:

因为条件是存在一个1的联通块包含着一个0的联通快的才是 0 所以,我们先预处理边界,对于0的边界处理成以访问过,对于边界是1的不做操作。
然后暴力判断每个点是否访问过来进行dfs求联通块的个数,如果0的个数和1的个数都是1,那么可以肯定图像为0,如果0的个数是0,1的个数是1,那么图像为1

#include<stdio.h>#include <iostream>#include<string.h>#include<math.h>#include<algorithm>#define eps 1e-8typedef long long int lli;using namespace std;int ma[550][550];bool v[550][550];char s[550];int dir[4][2] = {0,-1, 0,1, -1,0, 1,0};void dfs(int x,int ii,int jj){    v[ii][jj] = 1;    for(int i = 0;i <= 3;i++){        int iii = ii+dir[i][0], jjj = jj + dir[i][1];        if(ma[iii][jjj] == x && !v[iii][jjj]){            dfs(x,iii,jjj);        }    }}int main(){    int n,m;    while(~scanf("%d%d",&n,&m)){        memset(ma,0,sizeof(ma));        memset(v,0,sizeof(v));        for(int i = 1;i <= n;i++){            scanf("%s",s);            for(int j = 0;s[j];j++){                if(s[j]=='1') ma[i][j+1] = 1;                if(s[j]=='0') ma[i][j+1] = -1;            }        }        for(int j = 1;j <= m;j++){            if(!v[1][j] && ma[1][j]==-1) dfs(-1,1,j);            if(!v[n][j] && ma[n][j]==-1) dfs(-1,n,j);        }        for(int i = 1;i <= n;i++){            if(!v[i][1] && ma[i][1]==-1) dfs(-1,i,1);            if(!v[i][m] && ma[i][m]==-1) dfs(-1,i,m);        }        int cnt0=0,cnt1=0;        for(int i = 1;i <= n;i++){            for(int j = 1;j <= m;j++){                if(!v[i][j]){                    if(ma[i][j]==1){                        cnt1++;                    }                    if(ma[i][j]==-1){                        cnt0++;                    }                    dfs(ma[i][j],i,j);                }            }        }        if(cnt0==cnt1 && cnt1==1){            puts("0");        }        else if(cnt0==0 && cnt1 == 1){            puts("1");        }        else            puts("-1");    }    return 0;}