AC:
```cpp
// https://www.luogu.com.cn/discuss/588777
#include <bits/stdc++.h>
using namespace std;
int n,m,x,y,xx,yy,vis[420][420],flag=1;
char mapp[320][320],mapp2[320][320];
int wx[8]={1,0,0,-1,1,1,-1,-1};
int wy[8]={0,1,-1,0,1,-1,1,-1};
struct nod{
int x,y,t;
};
queue<nod>q;
int dx[4]={1,0,0,-1};
int dy[4]={0,1,-1,0};
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mapp[i][j];
mapp2[i][j]=mapp[i][j];
}
}
while(1){
cin>>x>>y>>xx>>yy;
if(x==0&&y==0&&xx==0&&yy==0){
return 0;
}
mapp2[x][y] = '#'; // 这里!
for(int i=0;i<8;i++){
int nx=x+wx[i];
int ny=y+wy[i];
while(mapp[nx][ny]!='X'&&nx>=1&&nx<=n&&ny>=1&&ny<=m){
mapp2[nx][ny]='#';
nx+=wx[i];
ny+=wy[i];
}
}
nod begin;
begin.x=xx;
begin.y=yy;
begin.t=0;
vis[xx][yy]=1;
q.push(begin);
if(mapp2[xx][yy] == '#'){ // 这里!
flag = 0;
cout << 0 << endl;
} else while(q.empty()==0){
nod now=q.front();
q.pop();
for(int i=0;i<4;i++){
nod nxt;
nxt.x=now.x+dx[i];
nxt.y=now.y+dy[i];
nxt.t=now.t+1;
if(nxt.x>=1&&nxt.x<=n&&nxt.y>=1&&nxt.y<=m&&vis[nxt.x][nxt.y]==0&&mapp[nxt.x][nxt.y]!='X'){
if(mapp2[nxt.x][nxt.y]=='#'){
cout<<nxt.t<<endl;
flag=0;
break;
}
q.push(nxt);
vis[nxt.x][nxt.y]=1;
}
}
if(flag==0){
break;
}
}
if(flag){
cout<<"Poor Harry"<<endl;
}
flag=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
vis[i][j]=0;
}
}
while(q.empty()==0){
q.pop();
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
mapp2[i][j]=mapp[i][j];
}
}
}
return 0;
}
```
by x383494 @ 2023-03-26 10:53:18
感谢,受教了
by zhangchengyi356535 @ 2023-03-26 10:58:52