个人感觉思路没什么问题,样例以及自造样例都过了可就是满江红
#include<bits/stdc++.h>
using namespace std;
struct node {
int x, y;
} q[25050];
const int mxn = 502;
const int d[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};//bfs必备方向数组
bool v[mxn][mxn];//标记数组
char s[mxn][mxn];//地图
int sum = 0, n, m;
void bfs(int, int);
bool is(int x, int y) {//判断点是否在地图内
return x < 1 || y < 1 || x > n || y > m;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> s[i][j];
v[i][j] = (s[i][j] == '0');
}
}
for (int i = 1; i < n; i++) {
if (s[i][1] == '0') {
bfs(i, 1);
} else if (s[i][m] == '0') {
bfs(i, m);
}
}
for (int i = 1; i < m; i++) {
if (s[1][i] == '0') {
bfs(1, i);
} else if (s[n][i] == '0') {
bfs(n, i);
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (s[i][j] == '0') {
sum++;
}
}
}
printf("%d", sum);
return 0;
}
void bfs(int x, int y) {
int head = 0, tail = 1;
q[1].x = x;
q[1].y = y;
v[x][y] = 0;
s[x][y]='*';
while (head < tail) {
head++;
for (int i = 0; i < 4; i++) {
int xx = q[head].x + d[i][0];
int yy = q[head].y + d[i][1];
if (is(xx, yy)) continue;
if (s[xx][yy] == '*') continue;
s[xx][yy] = '*';
q[++tail].x = xx;
q[tail].y = yy;
}
}
}
求各位dalao帮帮本蒟蒻