附上评测记录:https://www.luogu.com.cn/record/200856755
#include<bits/stdc++.h>
using namespace std;
int main(){
cin.tie(0)->sync_with_stdio(0);
int n,m;
cin>>n>>m;
vector<int>mp(16390);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char c;
cin>>c;
if(c=='O'){
mp[(i-1)*m+j]=1;
}
}
}
int a,b,c,d;
vector<int>dx={0,-m+1,1,1+m,m,m-1,-1,-1-m,-m};
while(cin>>a>>b>>c>>d&&a){
vector<int>pd(16390,0),vis(16390,0);
function<bool(int,int)>init=[&](int k,int x){
// cout<<k<<':'<<endl;
while(mp[x]&&x){
// cout<<x<<endl;
pd[x]=1;
if(((x+dx[k])-1)/m>=n||x+dx[k]<1||(k<4&&x%m==0)||(k>4&&k!=8&&x%m==1)){
break;
}
x+=dx[k];
}
return 1;
};
for(int i=1;i<=8;i++){
init(i,((a-1)*m+b));
}
// for(int i=1;i<=n*m;i++){
// cout<<pd[i];
// }
// cout<<(a-1)*m+b<<endl;
queue<tuple<int,int>>q;
vis[(c-1)*m+d]=1;
q.push({(c-1)*m+d,0});
bool f=1;
vector<int>di={0,1,m,-1,-m};
while(!q.empty()){
auto [x,z]=q.front();
q.pop();
if(pd[x]){
cout<<z<<endl;
f=0;
break;
}
for(int i=1;i<=4;i++){
int nx=x+di[i];
if(!mp[nx]||vis[nx]){
continue;
}
if((nx-1)/m>=n||nx<1||(i==1&&x%m==0)||(i==3&&x%m==1)){
continue;
}
q.push({nx,z+1});
vis[nx]=1;
}
}
if(f){
cout<<"Poor Harry"<<endl;
}
}
}