HDU 6113 度度熊的01世界 dfs

来源:互联网 发布:mp4转gif mac 编辑:程序博客网 时间:2024/06/05 09:16

度度熊的01世界

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 261    Accepted Submission(s): 51


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
 

Source
2017"百度之星"程序设计大赛 - 初赛(A) 

题意:判断1数字组成的图形是1,还是0,或者都不是。

答案是0的话,1的内部有一些连着的0(只能找到一堆)

答案是1的话,1的内部没有0。

答案是-1的话,1的内部有一些连着的0(能找到多堆),或者没有找到1,或者有多堆1.

思路:

题上说1内的0,不会到边界,所以先把边界上的所有0搜一遍,剩下的就是里面的1,和1里面的0了,统计剩下的1,和0 的堆数,就能确定答案了。

AC代码:

#include <cstdio>#include <cstring>#include <queue>#include <list>#include <algorithm>#define N 105using namespace std;int vis[N][N];//标记char ma[N][N];//地图int dx[5]= {0,0,1,-1};//四个方向int dy[5]= {1,-1,0,0};int n,m;void dfs(int x,int y,char s){    int xx,yy;    for(int i=0; i<4; i++)    {        xx=x+dx[i];        yy=y+dy[i];        if(vis[xx][yy]) continue;        if(xx<=0||xx>n||yy<=0||yy>m) continue;        if(ma[xx][yy]==s)        {            vis[xx][yy]=1;            dfs(xx,yy,s);        }    }}int main(){    while(~scanf("%d%d",&n,&m))    {        memset(vis,0,sizeof(vis));        for(int i=1; i<=n; i++)            scanf("%s",ma[i]+1);        for(int i=1; i<=m; i++)//处理四个边界的0        {            if(ma[1][i]=='0')            {                vis[1][i]=1;                dfs(1,i,ma[1][i]);            }            if(ma[n][i]=='0')            {                vis[n][i]=1;                dfs(n,i,ma[n][i]);            }        }        for(int i=1; i<=n; i++)        {            if(ma[i][1]=='0')            {                vis[i][1]=1;                dfs(i,1,ma[i][1]);            }            if(ma[i][m]=='0')            {                vis[i][m]=1;                dfs(i,m,ma[i][m]);            }        }        int a1=0,a0=0;        for(int i=1; i<=n; i++)//统计剩下的1和0的堆数            for(int j=1; j<=m; j++)            {                if(!vis[i][j])                {                    vis[i][j]=1;                    if(ma[i][j]=='0')  a0++;                    else   a1++;                    dfs(i,j,ma[i][j]);                }            }        if(a1==1&&a0==0)            printf("1\n");        else if(a1==1&&a0==1)            printf("0\n");        else printf("-1\n");    }}






原创粉丝点击