百度之星初赛(A)--度度熊的01世界----bfs搜索

来源:互联网 发布:宝马五系轮毂数据 编辑:程序博客网 时间:2024/05/17 05:50

度度熊的01世界

Accepts: 967
Submissions: 3064
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
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

题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=775&pid=1006


bfs遍历,调整好姿势直接上就可以,百度之星初赛A的第三个签到。

代码:

#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int dx[4]={0,0,-1,1},dy[4]={-1,1,0,0};int n,m,b[5],a[200][200],vis[200][200],x[50000],y[50000];char s[200];void bfs(int xx,int yy){    vis[xx][yy]=true;    int flag=a[xx][yy];    b[flag]++;    int head=1,tail=1;    x[1]=xx,y[1]=yy;    for(;head<=tail;head++){        for(int i=0;i<4;i++){            if(x[head]+dx[i]>=0&&x[head]+dx[i]<=n&&y[head]+dy[i]>=0&&y[head]+dy[i]<=m){                int u=x[head]+dx[i];                int v=y[head]+dy[i];                if(!vis[u][v]&&a[u][v]==flag){                    vis[u][v]=true;                    tail++;                    x[tail]=u,y[tail]=v;                }            }        }    }}int main(){    while(~scanf("%d%d",&n,&m)){        for(int i=0;i<=n+1;i++){            for(int j=0;j<=m+1;j++){                a[i][j]=0;            }        }        for(int i=1;i<=n;i++){            scanf("%s",s+1);            for(int j=1;j<=m;j++){                a[i][j]=(s[j]=='1');            }        }        n++,m++,b[0]=b[1]=0;        for(int i=0;i<=n;i++){            for(int j=0;j<=m;j++){                vis[i][j]=false;            }        }        for(int i=0;i<=n;i++){            for(int j=0;j<=m;j++){                if(!vis[i][j])                    bfs(i,j);            }        }        if(b[1]==1&&b[0]==1)            printf("1\n");        else if(b[1]==1&&b[0]==2)                printf("0\n");        else            printf("-1\n");    }    return 0;}