```cpp
void dfs(int x,int y)
{
if(map[x][y]==0&&x>=0&&x<n&&y>=0&&y<n)
{
map[x][y]=2;
dfs(x+1,y);
dfs(x,y+1);
dfs(x-1,y);
dfs(x,y-1);
}
return ;
}
```
当x为0时`dfs(x-1,y)`的第一个参数是负的
by zhy137036 @ 2020-01-09 16:51:16
然后进去`map[x][y]`下标就会超
by zhy137036 @ 2020-01-09 16:52:16
另外对于这种数据就会出问题,只能搜到左上角的0
```
5
0 1 1 1 0
1 1 0 1 1
1 0 0 0 1
1 1 0 1 1
0 1 1 1 0
```
by zhy137036 @ 2020-01-09 16:54:41
@[西门张大炮](/user/265528)
by zhy137036 @ 2020-01-09 16:56:28
@[zhy123456](/user/178294) 看到了,我在想着怎么解决
by 西门张大炮 @ 2020-01-09 17:02:09
@[zhy123456](/user/178294) 刚接触搜索,脑子还不大好使。谢谢大佬解决疑问
by 西门张大炮 @ 2020-01-09 17:03:27
```cpp
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int map[40][40];
int n;
void dfs(int x,int y)
{
if(map[x][y])return;
map[x][y]=2;
if(x>=1)dfs(x-1,y);
if(y>=1)dfs(x,y-1);
if(x<=n)dfs(x+1,y);
if(y<=n)dfs(x,y+1);
return;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&map[i][j]);
dfs(0,0);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d ",2-map[i][j]);
printf("\n");
}
return 0;
}
```
by zhy137036 @ 2020-01-09 17:04:49
~~建议改善码风~~
by zhy137036 @ 2020-01-09 17:05:16
@[zhy123456](/user/178294) 好的,谢谢指点
by 西门张大炮 @ 2020-01-09 17:06:08
@[西门张大炮](/user/265528)
尝试用一下
**灌水**
?
想象这是一个封闭的房间,由一圈“1”围住,我们可以把四周灌成与“墙”齐平的,然后中间就会有一块空地(“0”),
**这些空地就是要改为“2”的部分**
# 如何实现?
## 1
由地图四面八方(四周,遇到1就不管了)开始dfs/bfs(灌水),能走到的全都置“1”
```
↓ ↓ ↓ ↓ ↓ ↓
→0 0 0 0 0 0←
→0 0 1 1 1 1←
→0 1 1 0 0 1← 四面八方“灌水”
→1 1 0 0 0 1←
→1 0 0 0 0 1←
→1 1 1 1 1 1←
↑ ↑ ↑ ↑ ↑ ↑
```
## 2
Step1做完后就会产生一个一片1中间有一片0的情况,如:
```
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
```
## 3
对比原图,把上图中为0的地方在原图中标2
## 4
输出
我使用bfs的看看你能不能看得懂:(部分代码)
```
for(int i=1;i<=n;i++)//灌水部分
{
bfs(1,i);
bfs(i,1);
bfs(i,n);
bfs(n,i);
}
```
```
struct node
{
int x;
int y;
}
int n
int p[31][31],ot[31][31];
int fx1[4]={0,0,1,-1};
int fx2[4]={1,-1,0,0};
int walk[31][31];
queue<node> dl
void bfs(int x,int y)//bfs宽搜实现
{
if(p[x][y]||walk[x][y])
return ;
dl.push((node){x,y});
walk[x][y]=1;
p[x][y]=1;
while(!dl.empty())
{
node a=dl.front();
dl.pop();
for(int i=0;i<4;i++)
{
int nx=a.x+fx1[i],ny=a.y+fx2[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&!p[nx][ny]&&!walk[nx][ny])
{
walk[nx][ny]=1;
p[nx][ny]=1
dl.push((node){nx,ny});
}
}
}
}
```
希望能帮到您哦。。。
by wwsz_cn @ 2020-01-10 12:36:15