8pts求调 代码如下 提交记录
#include <iostream>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <queue>
#include <cstring>
using namespace std;
char mp[110][110];
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};
struct node{
int x,y,step;
};
queue <node> q;
int n,m;
int bfs(node s,node e){
bool end[110][110];
bool vis[110][110];
memset(end,0,sizeof(end));
memset(vis,0,sizeof(vis));
for(int i = e.x;i >= 0 && mp[i][e.y] != 'X';i--) end[i][e.y] = 1;
for(int i = e.x;i < n && mp[i][e.y] != 'X';i++) end[i][e.y] = 1;
for(int i = e.x,j = e.y;i >= 0 && j >= 0;i--,j--){
if(mp[i][j] != 'X') end[i][j] = 1;
else break;
}
for(int i = e.x,j = e.y;i < n && j >= 0;i++,j--){
if(mp[i][j] != 'X') end[i][j] = 1;
else break;
}
for(int i = e.x,j = e.y;i >= 0 && j < m;i--,j++){
if(mp[i][j] != 'X') end[i][j] = 1;
else break;
}
for(int i = e.x,j = e.y;i < n && j < m;i++,j++){
if(mp[i][j] != 'X') end[i][j] = 1;
else break;
}
for(int i = e.y;i >= 0 && mp[e.x][i] != 'X';i--) end[e.x][i] = 1;
for(int i = e.y;i < m && mp[e.x][i] != 'X';i++) end[e.x][i] = 1;
/*cout << endl;
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
if(s.x == i && s.y == j){
cout << "st ";
continue;
}else if(e.x == i && e.y == j){
cout << "ed ";
continue;
}
cout << mp[i][j] << end[i][j] << ' ';
}
cout << endl;
}*/
if(end[s.x][s.y]) return 0;
if(s.x == e.x && s.y == e.y) return 0;
q.push(s);
vis[s.x][s.y] = 1;
while(!q.empty()){
node u = q.front();
q.pop();
for(int i = 0;i < 4;i++){
node v = u;
v.x = u.x + dx[i];
v.y = u.y + dy[i];
v.step++;
if(v.x < 0 || v.x >= n || v.y < 0 || v.y >= m) continue;
if(mp[v.x][v.y] == 'X') continue;
if(vis[v.x][v.y]) continue;
q.push(v);
if(end[v.x][v.y]){
return v.step;
}
vis[v.x][v.y] = 1;
}
}
return -1;
}
int main(){
ios::sync_with_stdio(0);
cin >>n >>m;
for(int i = 0;i < n;i++){
cin >> mp[i];
}
int sx,sy,ex,ey;
while(cin >>sx >>sy >> ex >> ey){
if(sx == 0){
break;
}
int res = bfs(node{sx-1,sy-1,0},node{ex-1,ey-1});
if(res == -1){
cout <<"Poor Harry\n";
}else{
cout <<res << endl;
}
}
return 0;
}