百度之星初赛(A)Hdu-6113.度度熊的01世界

来源:互联网 发布:网络教育第二学位 编辑:程序博客网 时间:2024/05/21 03:47

Problem Description
度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成。

现在给你一个n*m的图像,你需要分辨他究竟是0,还是1,或者两者均不是。

图像0的定义:存在1字符且1字符只能是由一个连通块组成,存在且仅存在一个由0字符组成的连通块完全被1所包围。

图像1的定义:存在1字符且1字符只能是由一个连通块组成,不存在任何0字符组成的连通块被1所完全包围。

连通的含义是,只要连续两个方块有公共边,就看做是连通。

完全包围的意思是,该连通块不与边界相接触。
 

Input
本题包含若干组测试数据。
每组测试数据包含:
第一行两个整数n,m表示图像的长与宽。
接下来n行m列将会是只有01组成的字符画。

满足1<=n,m<=100
 

Output
如果这个图是1的话,输出1;如果是0的话,输出0,都不是输出-1。
 

Sample Input
32 32000000000000000000000000000000000000000000011111111000000000000000000000001111111111100000000000000000000011111111111100000000000000000001111111111111100000000000000000011111100011111000000000000000001111100000011110000000000000000011111000000111110000000000000000111110000000111110000000000000011111100000001111100000000000000111111000000001111100000000000001111110000000001111000000000000011111100000000011111000000000000111110000000000111100000000000001111000000000001111000000000000011110000000000011110000000000000111100000000000011100000000000000111100000000000111000000000000001111000000000001110000000000000011110000000000011100000000000001111000000000011110000000000000011110000000000111100000000000000011100000000001111000000000000000111110000011111110000000000000001111100011111111000000000000000011111111111111100000000000000000011111111111111000000000000000001111111111111000000000000000000001111111111100000000000000000000001111111000000000000000000000000011111000000000000000000000000000000000000000000000000032 3200000000000000000000000000000000000000000000000011111100000000000000000000000000111111100000000000000000000000011111111000000000000000000000001111111110000000000000000000000001111111100000000000000000000000011111111000000000000000000000001111111100000000000000000000000011111110000000000000000000000001111111100000000000000000000000011111111100000000000000000000000111111111000000000000000000000001111111100000000000000000000000111111100000000000000000000001111111111000000000000000000001111111111111000000000000000000111111111111110000000000000000001111111111111100000000000000000011111111111110000000000000000000000011111111110000000000000000000000000011111100000000000000000000000001111111000000000000000000000001111111100000000000000000000000001111111100000000000000000000000011111111000000000000000000000000111111111000000000000000000000001111111110000000000000000000000000111111110000000000000000000000000011111111110000000000000000000000111111111100000000000000000000000111111111000000000000000000000000000000000000003 3101101011
 

Sample Output
01-1
根据图的定义,1的联通块有且只有一个,否则就是输出-1,然后再考虑0的连通块,如果被1保卫的连通块有且只有一个,那么就是0,否则就是-1.所以,我们只要广搜一遍,找出1的连通块个数,和0的联通块个数,由于只有0和1两种情况 ,所以,若有0的连通块被1保卫,那么这些0就不会与边界相连,而其他0的连通块必定要与 边界相连,所以我们再记录一下与边界连接的连通块 的个数,如果0的连通块 的个数减去0的连通块并且与边界相连的 个数刚好是1,那么这个连通块就是0,。

否则,如果1的连通块个数为1,并且 没有被1包围的连通块,那么就是1,否则:输出-1.

#include <iostream>#include <stdio.h>#include <algorithm>#include <math.h>#include <queue>#include <vector>#include <string.h>#define LL long long#define siz 1005#define LL long long#define pd isusing namespace std;int n,m,k;int year,month,day;char ss[205][205];int flag1,flag0,flag;int ans1,ans0;struct node{    int gx,gy;};queue<node>que;bool is(int x,int y,char c){    if(x>=1&&x<=n&&y>=1&&y<=m&&c==ss[x][y]) return true;    return false;}void bfs(int x,int y,char c){    while(!que.empty()) que.pop();    node u,v;    u.gx = x;    u.gy = y;    que.push(u);    while(!que.empty()){        u = que.front();        que.pop();        if(u.gx==1||u.gx==n||u.gy==1||u.gy==m) flag = 1;        if(ss[u.gx][u.gy]=='-') continue;        ss[u.gx][u.gy]='-';        v.gx = u.gx;        v.gy = u.gy -1;        if(pd(v.gx,v.gy,c)){            que.push(v);        }        v.gy = u.gy +1;        if(pd(v.gx,v.gy,c)){            que.push(v);        }        v.gx = u.gx +1;        v.gy = u.gy;        if(pd(v.gx,v.gy,c)){            que.push(v);        }        v.gx = u.gx-1;        if(pd(v.gx,v.gy,c)){            que.push(v);        }    }}void solve(){    LL ans = 0;    while(!que.empty()) que.pop();    for(int i=1;i<=n;i++){        for(int j=1;j<=m;j++){            if(ss[i][j]!='-'){                char cc=ss[i][j];                if(ss[i][j]=='1') ans1++;                else if(ss[i][j] == '0') ans0++;                flag = 0;                bfs(i,j,ss[i][j]);                if(flag==1){                    if(cc=='1') flag1++;                    else if(cc == '0') flag0++;                }            }        }    }    if(ans0>=2&&ans1==1&&ans0-flag0==1){        printf("0\n");    }    else if(ans0==1&&ans1==1&&flag0==0){        printf("0\n");    }    else if(ans1==1&&ans0==flag0){        printf("1\n");    }    else{        printf("-1\n");    }}int main(){    while(~scanf("%d%d",&n,&m)){        for(int i=1;i<=n;i++){            scanf("%s",ss[i]+1);        }        flag1=0,flag0=0;        ans1=0;        ans0=0;       solve();    }    return 0;}





阅读全文
0 0
原创粉丝点击