1AC 9WA
#include <bits/stdc++.h>
#define ri register int
using namespace std;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int gx[]={-1,0,1,1,1,0,-1,-1};
int gy[]={1,1,1,0,-1,-1,-1,0};
char a[5005][5005];
int mp[5005][5005],ans[5005][5005];
bool vis[5005][5005];
int n,m;
struct Node{
int x,y;
}b,e,now,pos;
queue <Node> q;
inline bool check(int x,int y)
{
if (x==e.x&&y==e.y)return 1;
for (ri i=0;i<8;++i)
{
int xx=x+gx[i];
int yy=y+gy[i];
while (xx>=1&&xx<=n&&yy>=1&&yy<=m&&mp[xx][yy])
{
if (xx==e.x&&yy==e.y) return 1;
xx+=gx[i];
yy+=gy[i];
}
}
return 0;
}
inline int bfs()
{
q.push(b);
vis[b.x][b.y]=1;
while (!q.empty())
{
now=q.front();
q.pop();
if (check(now.x,now.y))return ans[now.x][now.y];
for (ri i=0;i<4;++i)
{
pos.x=now.x+dx[i];
pos.y=now.y+dy[i];
if (pos.x>=1&&pos.x<=n&&pos.y>=1&&pos.y<=m&&!vis[pos.x][pos.y]&&mp[pos.x][pos.y])
{
q.push(pos);
vis[pos.x][pos.y]=1;
ans[pos.x][pos.y]=ans[now.x][now.y]+1;
}
}
}
return -1;
}
int main()
{
scanf ("%d%d",&n,&m);
for (ri i=1;i<=n;++i)
{
scanf ("%s",a[i]+1);
for (ri j=1;j<=m;++j)
mp[i][j]=a[i][j]=='X'?0:1;
}
while (~scanf ("%d%d%d%d",&b.x,&b.y,&e.x,&e.y)&&b.x&&b.y&&e.x&&e.y)
{
int x=bfs();
if (x==-1)puts("Poor Harry");
else printf ("%d\n",x);
}
return 0;
}