40分,弟弟求助

P1162 填涂颜色

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


| 下一页