广搜走迷宫 50pts 求 hack

P2199 最后的迷宫

```cpp #include <bits/stdc++.h> using namespace std; int n,m,ex,ey,sx,sy; int maze[255][255]; char ch; int vis[255][255]; const int dx[]={0,0,1,-1},dy[]={1,-1,0,0}; inline bool valid(const int &x,const int &y) { return x>=1 && x<=n && y>=1 && y<=m; } struct state { int x,y,dep; }; queue <state> q; inline int bfs() { q.push((state){sx,sy,0}); while(!q.empty()) { int x=q.front().x,y=q.front().y; for(int d=0;d<4;++d) { int xx=x+dx[d],yy=y+dy[d]; if(valid(xx,yy) && !maze[xx][yy] && vis[xx][yy]!=1) { if(vis[xx][yy]==2) { cout << q.front().dep+1 << endl; return 0; } vis[xx][yy]=1; q.push((state){xx,yy,q.front().dep+1}); } } q.pop(); } return -1; } int main() { cin >> n >> m; for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) { cin >> ch; if(ch=='X') maze[i][j]=1; } while(1) { cin >> ex >> ey >> sx >> sy; if(ex+ey+sx+sy==0) break; if(ex==sx&&ey==sy) { cout << 0 << endl; continue; } memset(vis,0,sizeof(vis)); int x=ex,y=ey; while(valid(x-1,y-1)&&!maze[x-1][y]&&!maze[x][y-1]&&!maze[x-1][y-1]) vis[x--][y--]=2; vis[x][y]=2,x=ex,y=ey; while(valid(x-1,y)&&!maze[x-1][y]) vis[x--][y]=2; vis[x][y]=2,x=ex,y=ey; while(valid(x-1,y+1)&&!maze[x-1][y]&&!maze[x][y+1]&&!maze[x-1][y+1]) vis[x--][y++]=2; vis[x][y]=2,x=ex,y=ey; while(valid(x,y+1)&&!maze[x][y+1]) vis[x][y++]=2; vis[x][y]=2,x=ex,y=ey; while(valid(x+1,y+1)&&!maze[x+1][y]&&!maze[x][y+1]&&!maze[x+1][y+1]) vis[x++][y++]=2; vis[x][y]=2,x=ex,y=ey; while(valid(x+1,y)&&!maze[x+1][y]) vis[x++][y]=2; vis[x][y]=2,x=ex,y=ey; while(valid(x+1,y-1)&&!maze[x+1][y]&&!maze[x][y-1]&&!maze[x+1][y-1]) vis[x++][y--]=2; vis[x][y]=2,x=ex,y=ey; while(valid(x,y-1)&&!maze[x][y-1]) vis[x][y--]=2; vis[x][y]=2,x=ex,y=ey; if(vis[sx][sy]==2) { cout << 0 << endl; continue; } vis[sx][sy]=1; // for(int i=1;i<=n;cout << endl,++i) // for(int j=1;j<=m;++j) // cout << vis[i][j] << " "; while(!q.empty()) q.pop(); if(bfs()) cout << "Poor Harry\n"; } return 0; } ```
by SlaineTroyard @ 2023-04-04 21:11:07


@[Franz_Liszt](/user/450246) 找出来了 你的那几个while判断条件写错了
by Katz @ 2023-04-04 21:33:33


@[_PMAC_](/user/570194) 超 具体一点(
by SlaineTroyard @ 2023-04-04 21:34:28


题目写只要能看见就行了,而八个方向都可以直接看见 也就是说 0 1 1 0 的这个例子里面,[1,1]是可以看到[2,2]的 也就是说你的while条件根本就不用加判断[1,2]和[2,1]是否为墙壁
by Katz @ 2023-04-04 21:35:06


@[Franz_Liszt](/user/450246)
by Katz @ 2023-04-04 21:35:14


@[_PMAC_](/user/570194) 6,我逝世 马的。想多了。
by SlaineTroyard @ 2023-04-04 21:35:48


@[Franz_Liszt](/user/450246) 以后写搜索题的时候一定要仔细看题面,它有写出来的(
by Katz @ 2023-04-04 21:36:31


@[_PMAC_](/user/570194) 我超,过了,膜拜 [_PMAC_](/user/570194)! %%%
by SlaineTroyard @ 2023-04-04 21:37:37


%%%%%%
by Tiger_Pan @ 2023-04-04 21:38:50


|