Problem
acm.hdu.edu.cn/showproblem.php?pid=6113
Meaning
给一幅位图,辨认里面的图像是 ‘0’ 还是 ‘1’,或者都不是。
Analysis
数 ‘1’ 的连通块数、被 ‘1’ 包含的 ‘0’ 的连通块数,然后简单判断。
判断 ‘0’ 是不是被 ‘1’ 包含,就看这个连通块是否接触到图像边界。
Code
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 100, M = N;
const int dx[] = {0, 0, -1, 1};
const int dy[] = {-1, 1, 0, 0};
char mp[N][M+2];
bool vis[N][M];
bool bound; // 连通块是否触及边界
int n, m;
void dfs(int x, int y, char p)
{
vis[x][y] = true;
for(int i = 0, nx, ny; i < 4; ++i)
{
nx = x + dx[i];
ny = y + dy[i];
if(nx < 0 || nx >= n || ny < 0 || ny >= m) // 触及边界
bound = true;
else if(mp[nx][ny] == p && !vis[nx][ny])
dfs(nx, ny, p);
}
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
for(int i = 0; i < n; ++i)
scanf("%s", mp[i]);
memset(vis, false, sizeof vis);
int zero = 0; // 不 包含在 '1' 内的 '0' 的连通块数
int one = 0; // '1' 的连通块数
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
if(!vis[i][j])
{
bound = false;
dfs(i, j, mp[i][j]);
if(mp[i][j] == '1')
++one;
else if(!bound)
++zero;
}
int ans;
if(one != 1)
ans = -1;
else if(!zero)
ans = 1;
else if(zero == 1)
ans = 0;
else
ans = -1;
printf("%d\n", ans);
}
return 0;
}