样例的运行:

code:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
struct dd{
int x,y,t;
}f;
int n,m,hx,hy,jx,jy;
char a[16386][16386];
bool b[16386][16386],vis[16386][16386];
queue<dd> q;
void clear(),yu(),bfs();
bool check(int,int);
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>a[i][j];
}
}
scanf("%d%d%d%d",&jx,&jy,&hx,&hy);
while(jx!=0){
memset(b,0,sizeof(b));
memset(vis,0,sizeof(vis));
yu();
bfs();
clear();
scanf("%d%d%d%d",&jx,&jy,&hx,&hy);
}
}
void clear(){
while(!q.empty())
q.pop();
}
void yu(){
b[jx][jy]=1;
int x=jx+1,y=jy;
while(a[x][y]=='O')
b[x++][y]=1;
x=jx-1,y=jy;
while(a[x][y]=='O')
b[x--][y]=1;
x=jx,y=jy+1;
while(a[x][y]=='O')
b[x][y++]=1;
x=jx,y=jy-1;
while(a[x][y]=='O')
b[x][y--]=1;
x=jx+1,y=jy+1;
while(a[x][y]=='O')
b[x++][y++]=1;
x=jx-1,y=jy+1;
while(a[x][y]=='O')
b[x--][y++]=1;
x=jx+1,y=jy-1;
while(a[x][y]=='O')
b[x++][y--]=1;
x=jx-1,y=jy-1;
while(a[x][y]=='O')
b[x--][y--]=1;
}
void bfs(){
vis[hx][hy]=1;
q.push((dd){hx,hy,0});
while(!q.empty()){
f=q.front();
q.pop();
if(b[f.x][f.y]){
printf("%d\n",f.t);
return;
}
for(int i=0;i<4;++i){
int nx=f.x+dx[i];
int ny=f.y+dy[i];
int nt=f.t+1;
if(check(nx,ny)){
vis[nx][ny]=1;
q.push((dd){nx,ny,nt});
}
}
}
printf("Poor Harry\n");
}
bool check(int x,int y){
if(a[x][y]=='X')
return 0;
if(x<1||x>n)
return 0;
if(y<1||y>m)
return 0;
if(vis[x][y])
return 0;
return 1;
}