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