rt,WA on #3-#8 #10-#11 MLE #12
#include<bits/stdc++.h>
#define f(i,a,b) for(int i = a ; i<=b ; i++)
#define r(i,a,b) for(int i = a ; i>=b ; i--)
using namespace std;
int n,m,sx,sy,ex,ey;
const int dx[8]={-1,1,0,0,-1,1,-1,1},dy[8]={0,0,-1,1,-1,1,1,-1};
struct node{
int x,y,s;
};
bool vis[16384][8005];
char g[16384][8005];
bool findit(int x,int y){
if(x == ex && y == ey) return 1;
f(i,0,7){
int nx = x+dx[i];
int ny = y+dy[i];
while(nx>=1&&nx<=n&&ny>=1&&ny<=m&&g[nx][ny] == 'O'){
if(nx == ex && ny == ey) return 1;
nx+=dx[i];
ny+=dy[i];
}
}
return 0;
}
void bfs(){
memset(vis,0,sizeof(vis));
queue<node> q;
q.push(node{sx,sy,0});
while(!q.empty()){
node cur = q.front();
q.pop();
if(findit(cur.x,cur.y)){
cout<<cur.s<<endl;
return ;
}
f(i,0,3){
int nx = cur.x+dx[i];
int ny = cur.y+dy[i];
if(nx>=1 && nx<=n && ny>=1 && ny<=m && g[nx][ny] != 'X' && !vis[nx][ny]){
vis[nx][ny] = 1;
q.push(node{nx,ny,cur.s+1});
}
}
}
cout<<"Poor Harry\n";
}
int main(){
cin>>n>>m;
f(i,1,n) f(j,1,m) cin>>g[i][j];
while(cin>>ex>>ey>>sx>>sy && ex & ey && sx && sy){
bfs();
}
return 0;
}