#include<iostream>
#include<utility>
#include<string.h>
#include<vector>
#include<queue>
using namespace std;
typedef struct{
int x;
int y;
int step;
}P;
queue<P> que;
int n,m;
const int maxn=2000;
int v[maxn][maxn];
int a[maxn][maxn];
int sx,sy,fx,fy;
int mov[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int mov1[8][2]={{0,1},{1,0},{0,-1},{-1,0},{-1,1},{1,1},{1,-1},{-1,-1}};
int jud(int x,int y){
//cout<<"x="<<x<<"y="<<y<<endl;
if(x==sx&&y==sy)return 1;
for(int i=0;i<8;i++){
int xx=x;
int yy=y;
while(1){
xx=xx+mov1[i][0];
yy=yy+mov1[i][1];
//cout<<"xx="<<xx<<"yy="<<yy<<" "<<a[xx][yy]<<endl;
if(a[xx][yy]==1){
// cout<<"ook"<<endl;
break;
}
if(xx==sx&&yy==sy) return 1;
}
}
return 0;
}
int bfs(){
int flag=0;
P p={fx,fy,1};
que.push(p);
v[fx][fy]=1;//代表已经走过
while(!que.empty()){
P p=que.front();
int step=p.step;
que.pop();
for(int i=0;i<4;i++){
int xx=p.x+mov[i][0];
int yy=p.y+mov[i][1];
if(v[xx][yy]==0&&a[xx][yy]==0){
v[xx][yy]=1;
P p1={xx,yy,step+1};
if(jud(p1.x,p1.y)){
//cout<<p.x<<p.y<<endl;
return p1.step;
}
que.push(p1);
}
}
}
return -1;
}
int main(){
cin>>n>>m;//n为行 m为列
for(int i=1;i<=n;i++){
string s;
cin>>s;
for(int j=1;j<=m;j++){
if(s[j-1]=='O'){
a[i][j]=0;//0表示空地
}else if(s[j-1]=='X'){
a[i][j]=1;//1表示有障碍
}
}
}
//增加围墙
for(int i=0;i<=n+1;i++) a[i][0]=a[i][m+1]=1;
for(int i=0;i<=m+1;i++) a[0][i]=a[n+1][i]=1;
while(cin>>sx>>sy>>fx>>fy){
if(sx==0&&sy==0&&fx==0&&fy==0) break;//(sx,sy)代表奖杯坐标 (fx,fy)代表哈利位置
memset(v,0,sizeof(v));
//bfs
while(!que.empty()) que.pop();//!!!!!注意每次队列都要清空
if(jud(fx,fy)){//特判
cout<<0<<endl;
continue;
}
int a=bfs();
if(a==-1) cout<<"Poor Harry"<<endl;
else cout<<a-1<<endl;
}
}
很直接的bfs,只不过是多个终点,但是我还是wa了很多次(队列没有清空初始化。。。。我恨)