#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
/*
搜索
现在给你一个n*m的图像,你需要分辨他究竟是0,还是1,或者两者均不是。
图像0的定义:存在1字符且1字符只能是由一个连通块组成,
存在且仅存在一个由0字符组成的连通块完全被1所包围。
图像1的定义:存在1字符且1字符只能是由一个连通块组成,
不存在任何0字符组成的连通块被1所完全包围。
在图片四周添加一圈0,然后分别求0和1连通块的个数
*/
const int maxn=100+5;
char mp[maxn][maxn];
bool vis[maxn][maxn];
int n,m;
void dfs(int x,int y,char ch)
{
if(x<0||x>n||y<0||y>m) return ;
if(mp[x][y]!=ch) return;
if(vis[x][y]) return;
vis[x][y]=1;
dfs(x-1,y,ch);
dfs(x+1,y,ch);
dfs(x,y-1,ch);
dfs(x,y+1,ch);
return ;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1; i<=n; i++)
{
scanf("%s",mp[i]+1);
}
//在原01矩阵的四周补0
n++;
m++;
for(int i=0;i<=n;i++)
{
mp[i][0]='0';
mp[i][m]='0';
}
for(int j=0;j<=m;j++)
{
mp[0][j]='0';
mp[n][j]='0';
}
memset(vis,0,sizeof(vis));
int ans[2];
ans[0]=0;//0的连通块的个数
ans[1]=0;//1的连通块的个数
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
if(!vis[i][j])
{
dfs(i,j,mp[i][j]);
int k=mp[i][j]-'0';
ans[k]++;
}
}
}
if(ans[0]==2&&ans[1]==1)
{
printf("0\n");
}
else if(ans[0]==1&&ans[1]==1)
{
printf("1\n");
}
else
{
printf("-1\n");
}
}
return 0;
}
HDU6113 度度熊的01世界(dfs)
最新推荐文章于 2020-07-05 10:55:02 发布