```
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int, int> PII;
int n, a[35][35], vis[35][35];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};
int flag;
queue <PII> q;
void bfs(int u, int v)
{
flag = 0;
q.push({u, v});
memset(vis, 0, sizeof vis);
vis[u][v] = 1;
while(q.size())
{
auto t = q.front();
q.pop();
for(int i = 0; i < 4; i++)
{
int x = t.first + dx[i], y = t.second + dy[i];
if(x < 0 || x > n - 1||y < 0 || y > n - 1)
{
flag = 1;
return ;//不在闭合圈
}
if(a[x][y] == 1) continue;
if(vis[x][y]) continue;
// 个人认为应该换一下,不然会越界(?
q.push({x, y});
vis[x][y] = 1;
}
}
if(!flag)
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
if(vis[i][j]) a[i][j] = 2;
return ;
}
int main ()
{
cin >> n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin >> a[i][j];
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
if(!vis[i][j] && a[i][j] != 1) bfs(i, j);
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
cout << a[i][j] << " ";
cout << "\n";
}
}
```
by zjh114514 @ 2024-03-11 22:03:33
@[Zeedzzz](/user/1134175)
by zjh114514 @ 2024-03-11 22:03:47
好的我发现了 是在return之前没有把队列清空导致下一次bfs时队列里有之前的坐标。
x<0||y<0是对的
by Zeedzzz @ 2024-03-11 22:13:06
@[zjh114514](/user/773944) 感谢!好快的回复 我看了半天发现是return那里的问题, 之前写bfs也没有中间return过 忘记要清空队列再return了
by Zeedzzz @ 2024-03-11 22:19:19