ac了但是还是有疑问

P1162 填涂颜色

``` #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


|