#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<iostream>
using namespace std;
int c, r;
char a[501][501];
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
int cnt = 0;
int vi[501][501];//记录是否访问
bool Isnum(int i, int j) {
if (vi[i][j] == 1)return false;
if (a[i][j] == '0')return true;
return false;
}
//这应该水漫法啊
void dfs(int i, int j) {
vi[i][j] = 1;//记录
for (int x = 0; x < 4; x++) {
int ty = i + dx[x];
int tx = j + dy[x];
if (tx >= 0 && tx < c && ty >= 0 && ty < r) {
if (Isnum(ty, tx)) {
dfs(ty, tx);
}
}
}
}
int main() {
cin>>r>>c;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cin >> a[i][j];//字符矩阵
}
}
//搜索四周
for (int i = 0; i < r; i++) {
if (Isnum(i, 0)) {
dfs(i, 0);
}
if (Isnum(i, c-1)) {
dfs(i, 0);
}
}
for (int i = 0; i < c; i++) {
if (Isnum(0, i)) {
dfs(0, i);
}
if (Isnum(r-1, i)) {
dfs(r-1, i);
}
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
//如果剩余没访问的0就是结果
if (a[i][j] == '0'&&vi[i][j]==0)cnt++;
}
}
printf("%d\n", cnt);
return 0;
}
过了两个样例,但是第一个测试点数据跑一遍结果就是不对的,想不通哪里出问题了???