【第61题】广度优先搜索(BFS)8连刷(一): 填涂颜色

2023-08-31 15:07:51 浏览数 (2)

题目

题目原文请移步下面的链接

  • https://www.luogu.com.cn/problem/P1162
    • 参考题解:https://www.luogu.com.cn/problem/solution/P1162
  • 标签:搜索广度优先搜索BFS

题解

  • 小码匠思路
    • 这也是个比较标准的连通块了,既然中间的0不好找,我们就反向寻找外层的进行标记,再反向把未标记的0输出时改为2
    • 外层的0很好找在于一个外层0构成的连通块一定有紧挨着边缘的,所以把四周走一遍就能覆盖掉外层0啦
  • 官方题解
    • 题解大家可移步看这里,很多童鞋写了各种解法
    • https://www.luogu.com.cn/problem/solution/P1162代码
代码语言:javascript复制
#include <bits/stdc  .h>
using namespace std;

int a[103][103];
int n;
int len[10005];
int b[103][103];

struct edge {
    int x, y;
};

queue<edge> v;

void bfs(int x, int y ) {
    v.push({x, y});
    while (!v.empty()) {
        edge k = v.front();
        v.pop();
        if (k.x - 1 >= 0 && !b[k.x - 1][k.y] && a[k.x - 1][k.y] == 0) {
            v.push({k.x - 1, k.y});
            b[k.x - 1][k.y] = true;
        }

        if (k.x   1 < n && !b[k.x   1][k.y] && a[k.x   1][k.y] == 0) {
            v.push({k.x   1, k.y});
            b[k.x   1][k.y] = true;
        }
        if (k.y - 1 >= 0 && !b[k.x][k.y - 1] && a[k.x][k.y - 1] == 0) {
            v.push({k.x, k.y - 1});
            b[k.x][k.y - 1] = true;
        }
        if (k.y   1 < n && !b[k.x][k.y   1] && a[k.x][k.y   1] == 0) {
            v.push({k.x, k.y   1});
            b[k.x][k.y   1] = true;
        }
    }
}

int main () {
    cin >> n;
    for (int i = 0; i < n;   i) {
        for (int j = 0; j < n;   j) {
            cin >> a[i][j];
        }
    }
    int ans = 0;
    for (int i = 0; i < n;   i) {
        if (a[0][i] == 0 && !b[0][i]) {
            bfs(0, i);
        }
        if (a[i][0] == 0 && !b[i][0]) {
            bfs(i, 0);
        }
        if (a[n - 1][i] == 0 && !b[n - 1][i]) {
            bfs(n - 1, i);
        }
        if (a[i][n - 1] == 0 && !b[i][n - 1]) {
            bfs(i, n - 1);
        }
    }
    for (int i = 0; i < n;   i) {
        for (int j = 0; j < n;   j) {
            if (a[i][j] == 0 && !b[i][j]) {
                cout << 2 << " ";
                continue;
            }
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

0 人点赞