知识点:深搜,连通块
还是比较简单的一道题,我们把外圈补一层0,然后深搜记录一下1和0的连通块的个数,就可以发现,1的连通块个数是1,0的是2,那么就是图像0,如果一和二都是1,那么就是图像1,其余的是-1,这样这个题就完成了
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n, m, a[N][N], cnt1, cnt2, vis[N][N];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
void dfs(int x, int y) {
vis[x][y] = 1;
for (int i = 0; i < 4; i++) {
int x1 = x + dx[i];
int y1 = y + dy[i];
if (x1 < 0 || x1 > n + 1 || y1 < 0 || y1 > m + 1) continue;
if (vis[x1][y1] || a[x1][y1] != a[x][y]) continue;
dfs(x1, y1);
}
}
int main() {
while (cin >> n >> m) {
memset(a, 0, sizeof(a));
memset(vis, 0, sizeof(vis));
cnt1 = cnt2 = 0;
for (int i = 1; i <= n; i++) {
string s;
cin >> s;
for (int j = 0; j < (int) s.size(); j++) {
if (s[j] == '1') a[i][j + 1] = 1;
}
}
for (int i = 0; i <= n + 1; i++) {
for (int j = 0; j <= m + 1; j++) {
if (!vis[i][j]) {
if (a[i][j]) cnt1++;
else cnt2++;
dfs(i, j);
}
}
}
if (cnt1 == 1 && cnt2 == 2) cout << 0 << '\n';
else if (cnt1 == 1 && cnt2 == 1) cout << 1 << '\n';
else cout << -1 << '\n';
}
return 0;
}