有错的地方我给你标出来了:
```
#include<bits/stdc++.h>
using namespace std;
long long n,m,xa[9]={0,-1,0,1,-1,1,-1,0,1},ya[9]={0,-1,-1,-1,0,0,1,1,1},xb[5]={0,-1,1,0,0},yb[5]={0,0,0,-1,1};
long long a,b,c,d,MAP[5005][5005],t,tx,ty;
char Map[5005][5005];
queue<long long>xx,yy,sum;
long long BFS(long long x,long long y)
{
if(MAP[x][y]==2)return 0;
xx.push(x);
yy.push(y);
sum.push(0);
MAP[x][y]=1;//初始化
while(!xx.empty())
{
x=xx.front();
y=yy.front();
for(int i=1;i<=4;i++)
{
tx=x+xb[i];
ty=y+yb[i];
if(MAP[tx][ty]==2)return sum.front()+1;
else if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&Map[tx][ty]=='O'&&MAP[tx][ty]==0)
{
MAP[tx][ty]=1;//写这里,标记写前面会排到队尾,可能同一个元素入队两次
xx.push(x+xb[i]);
yy.push(y+yb[i]);
sum.push(sum.front()+1);
}
}
xx.pop();
yy.pop();
sum.pop();
}
return -1;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>Map[i][j];
for(;;)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
MAP[i][j]=0;
while(!xx.empty())xx.pop();
while(!yy.empty())yy.pop();
while(!sum.empty())sum.pop();
cin>>a>>b>>c>>d;
if(a==0&&b==0&&c==0&&d==0)
break;
for(int i=1;i<=8;i++)
{
for(int x=a,y=b;;x+=xa[i],y+=ya[i])
{
if(x<1||x>n||y<1||y>m||Map[x][y]=='X')
break;
MAP[x][y]=2;
}
}
t=BFS(c,d);
if(t==-1)cout<<"Poor Harry\n"; //哈哈,你写的"Poor Harrn"
else cout<<t<<"\n";
}
return 0;
}
```
不谢
by mons @ 2022-08-22 18:00:01