2017"百度之星"程序设计大赛

来源:互联网 发布:伊朗 朝鲜 知乎 编辑:程序博客网 时间:2024/06/04 19:39

按照题目要求判断联通块个数和被包围个数之间的关系来判断图形。用dfs来进行联通块染色判断。

#include<bits/stdc++.h>using namespace std;const int MAXN = 110;char img[MAXN][MAXN];int n,m;bool vis[MAXN][MAXN];int cx[]={0,0,1,-1};int cy[]={1,-1,0,0};bool bound;void init(){    memset(vis,0,sizeof vis);    memset(img,0,sizeof img);}void dfs(int x,int y,int num){    vis[x][y]=true;    for(int i=0;i<4;i++)    {        int nx=cx[i]+x;        int ny=cy[i]+y;        if(img[nx][ny]==0)        {            bound=true;            continue;        }        if(vis[nx][ny]) continue;        if(img[nx][ny]!='0'+num) continue;        dfs(nx,ny,num);    }}int main(){    if (fopen("in.txt", "r") != NULL)    {        freopen("in.txt", "r", stdin);        // freopen("out.txt", "w", stdout);    }    while(cin>>n>>m)    {        init();        for(int i=1;i<=n;i++)            scanf("%s",img[i]+1);        int cnt1=0;        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            {                if(!vis[i][j]&&img[i][j]=='1')                {                    cnt1++;                    dfs(i,j,1);                }            }        }        if(cnt1!=1)        {            puts("-1");            continue;        }        int cnt0=0;        int bound0=false;        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            {                if(!vis[i][j]&&img[i][j]=='0')                {                    cnt0++;                    bound=false;                    dfs(i,j,0);                    if(bound) bound0++;                }            }        }        if(cnt0-bound0==1)        {            puts("0");            continue;        }        if(bound0==cnt0)        {            puts("1");            continue;        }        puts("-1");    }    return 0;}