hdu 6113 度度熊的01世界【搜索好题】

来源:互联网 发布:网络直播怎么赚钱的 编辑:程序博客网 时间:2024/05/16 05:19

题目

http://acm.hdu.edu.cn/showproblem.php?pid=6113

题意

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。

分析

有个很有技巧的做法,把图扩一圈,然后再找。
如果0的连通块数量是2,1的连通块数量是1,那么图形就是0
如果0的连通块数量是1,1的连通块数量是1,那么图形就是1
否则是输出-1

代码

#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <string>#include <vector>#include <queue>#include <map>#include <set>#include <cmath>using namespace std;const int N=105;int d[][2]={{-1,0},{1,0},{0,-1},{0,1}};int vis[N][N];char s[N][N];int n,m;void dfs(int x,int y,int c){    vis[x][y]=1;    for(int i=0;i<4;i++){        int xx=x+d[i][0],yy=y+d[i][1];        if(xx>=0&&yy>=0&&xx<=n&&yy<=m&&s[xx][yy]==c&&!vis[xx][yy])dfs(xx,yy,c);    }}int main(){    while(~scanf("%d%d",&n,&m)){        memset(s,0,sizeof(s));        memset(vis,0,sizeof(vis));        for(int i=1;i<=n;i++)scanf("%s",s[i]+1);        n++,m++;        for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)if(s[i][j]==0)s[i][j]='0';        int cnt1=0,cnt0=0;        for(int i=0;i<=n;i++){            for(int j=0;j<=m;j++){                if(s[i][j]=='1'&&!vis[i][j]){                    dfs(i,j,'1');                    cnt1++;                }                if(s[i][j]=='0'&&!vis[i][j]){                    dfs(i,j,'0');                    cnt0++;                }            }        }        int ans=-1;        if(cnt0==2&&cnt1==1)ans=0;        else if(cnt0==1&&cnt1==1)ans=1;        printf("%d\n",ans );    }    return 0;}
原创粉丝点击