改了一下 60pts
```cpp
#include <bits/stdc++.h>
using namespace std;
const int N=5005;
int g[N][N];
bool vis[N][N];
char s[N][N];
int n,m;
int b1,b2;
struct Node{
int step;
int px,py;
};
inline void out(){
for (int i=1;i<=n;i++,puts(""))
for (int j=1;j<=m;++j)
printf("%d ",g[i][j]);
}
Node q[N];
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};int tail,head;
inline int bfs(int x,int y){
vis[x][y]=1;
head=1,tail=0;
q[++tail].px=x,q[tail].py=y;
q[tail].step=0;
while (head<=tail){
int x=q[head].px,y=q[head].py,now=q[head].step;
head++;
for (int i=0;i<4;i++){
int nx,ny;
nx=x+dx[i];
ny=y+dy[i];
if (g[nx][ny]==2)
return now+1;
if (g[nx][ny]!=1&&nx>0&&ny>0&&nx<=n&&ny<=m&&!vis[nx][ny]){
vis[nx][ny]=1;
q[++tail].px=nx,q[tail].py=ny,q[tail].step=now+1;
}
}
}
return -1;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
cin>>s[i]+1;
for (int j=1;j<=m;j++)
g[i][j]=(s[i][j]=='X'?1:0);
}
int p,o;
cin>>p>>o>>b1>>b2;
while (p!=0&&o!=0&&b1!=0&&b2!=0){
memset(vis,0,sizeof vis);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
g[i][j]=(s[i][j]=='X'?1:0);
for (int i=p;i<=n;i++)
if (g[i][o]!=1)
g[i][o]=2;
else
break;
for (int i=p;i>=1;i--)
if (g[i][o]!=1)
g[i][o]=2;
else
break;
for (int j=o;j<=m;j++)
if (g[p][j]!=1)
g[p][j]=2;
else
break;
for (int j=o;j>=1;j--)
if (g[p][j]!=1)
g[p][j]=2;
else
break;
for (int i=p,j=o;i<=n&&j<=m;j++,i++)
if (g[i][j]!=1)
g[i][j]=2;
else
break;
for (int i=p,j=o;i>=1&&j>=1;--j,i--)
if (g[i][j]!=1)
g[i][j]=2;
else
break;
for (int i=p,j=o;i<=n&&j>=1;j--,i++)
if (g[i][j]!=1)
g[i][j]=2;
else
break;
for (int i=p,j=o;i>=1&&j<=m;j++,i--)
if (g[i][j]!=1)
g[i][j]=2;
else
break;
// out();
int ans=bfs(b1,b2);
// for (int p=1;p<=tail;p++)
// printf("%d %d %d\n",q[p].px,q[p].py,q[p].step);
if (ans==-1){
puts("Poor Harry");
cin>>p>>o>>b1>>b2;
continue;
}
cout<<ans<<endl;
cin>>p>>o>>b1>>b2;
}
}
/*
3 4
OOOO
XXXO
OOOO
3 3 1 1
0 0 0 0
*/
```
by QZY2008 @ 2022-09-22 01:09:09