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