???

P1162 填涂颜色

Jonnynb @ 2024-12-07 13:05:05

看到一篇题解长这样: _ LMB_001 LMB_001 创建时间:2017-09-01 20:35 查看文章 楼下dalao们的都看不懂,只好自己写了一个搜索的啦,用染色法,其实 可以先练习拯救总部那道

c++:

#include <bits/stdc++.h>
using namespace std;
int a[32][32],b[32][32];
int dx[5]={0,-1,1,0,0};
int dy[5]={0,0,0,-1,1};//第一个表示不动,是充数的,后面的四个分别是上下左右四个方向
int n,i,j;
void dfs(int p,int q){
    int i;
    if (p<0||p>n+1||q<0||q>n+1||a[p][q]!=0) return;//如果搜过头或者已经被搜过了或者本来就是墙的就往回
    a[p][q]=1;//染色
    for (i=1;i<=4;i++) dfs(p+dx[i],q+dy[i]);//向四个方向搜索
}
int main(){
    cin>>n;
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++){
            cin>>b[i][j];//其实不拿两个数组也可以,不过我喜欢啦
            if (b[i][j]==0) a[i][j]=0;
            else a[i][j]=2;
        }
    dfs(0,0);//搜索 从0,0开始搜
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++)
        if (a[i][j]==0) cout<<2<<' ';//如果染过色以后i,j那个地方还是0,说明没有搜到,就是周围有墙,当然就是被围住了,然后输出2
        else cout<<b[i][j]<<' ';//因为被染色了,本来没有被围住的水和墙都染成了1,所以就输出b[i][j]
        cout<<'\n';//换行
    }

//~~题解结束~~

我有一个问题:样例是这样怎么办?:

1 1 1 0 0
1 0 1 0 0
1 1 1 0 0
0 0 0 0 0
0 0 0 0 0

他的DFS是从(0, 0)开始搜的,(0, 0)1,就直接结束了呀,他的解决方案是什么?我问了一下GPT,他帮我加了四个方向的搜索,却错了,是什么意思?:

#include <iostream>
using namespace std;

const int MAXN = 32; // 最大网格大小
int grid[MAXN][MAXN];
int dx[4] = {-1, 1, 0, 0}; // 四个方向
int dy[4] = {0, 0, -1, 1};
int n;

// 从指定位置进行 DFS
void dfs(int x, int y) {
    if (x < 0 || x > n + 1 || y < 0 || y > n + 1 || grid[x][y] != 0) return;
    grid[x][y] = 1; // 标记为空地染色
    for (int i = 0; i < 4; i++) {
        dfs(x + dx[i], y + dy[i]);
    }
}

int main() {
    cin >> n;

    // 初始化边界为 0
    for (int i = 0; i <= n + 1; i++) {
        for (int j = 0; j <= n + 1; j++) {
            grid[i][j] = 0;
        }
    }

    // 输入网格
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> grid[i][j];
            if (grid[i][j] != 0) grid[i][j] = 2; // 墙
        }
    }

    // 从所有边界点出发进行 DFS
    for (int i = 0; i <= n + 1; i++) {
        dfs(i, 0);       // 左边界
        dfs(i, n + 1);   // 右边界
    }
    for (int j = 0; j <= n + 1; j++) {
        dfs(0, j);       // 上边界
        dfs(n + 1, j);   // 下边界
    }

    // 输出结果
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (grid[i][j] == 0) cout << 2 << ' '; // 被围住的空地
            else if (grid[i][j] == 1) cout << 0 << ' '; // 没有被围住的空地
            else cout << 2 << ' '; // 墙
        }
        cout << '\n';
    }

    return 0;
}

dalao们帮忙解答一下


by opzc35 @ 2024-12-07 13:19:48

@Jonnynb 这个输入样例是从1到n开始搜索的,所以第一行第一列并不是存储在b[0][0]里面,而是存在b[1][1]里面

至于a[0][0]这些没被赋值的数组变量,在主函数外面定义的话时默认为0的


by Jonnynb @ 2024-12-07 20:25:01

@opzc35 so? 那为什么我的错了?


by opzc35 @ 2024-12-07 22:33:14

@Jonnynb 这个貌似输出的时候有问题,应该是

if(grid[i][j]==1)cout<<0<<" ";//没有被围住的空地
else if(grid[i][j]==2)cout<<1<<" ";//墙
else cout<<2<<" ";//被围住的空地

更改后可AC


by Jonnynb @ 2024-12-08 14:36:20

感谢dalao


|