P2199 最后的迷宫
对于每一个数据,扩展哪些点能看见奖杯,然后bfs寻找
#include<iostream>
#include<queue>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct xy{
int x;
int y;
int t;
};
queue <xy> q;
int vis[1001][1010];
char ma[1010][1010];
int mx[9]={0,1,1,1,0,-1,-1,-1};
int my[9]={1,1,0,-1,-1,-1,0,1};
int mx1[5]={0,1,0,-1};
int my1[5]={1,0,-1,0};
int n,m;
int xx,yy,xxx,yyy;
int f;
int cnt;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)
cin>>ma[i][j];
}
while(scanf("%d%d%d%d",&xx,&yy,&xxx,&yyy)){
cnt++;
if(!xx&&!yy&&!xxx&&!yyy){
return 0;
}
f=0;
vis[xx][yy]=cnt*2;
for(int i=0;i<=7;++i){
int u=xx+mx[i];
int v=yy+my[i];
while(ma[u][v]=='O'){
vis[u][v]=cnt*2;;
u+=mx[i];
v+=my[i];
}
}
if(vis[xxx][yyy]==cnt*2){
cout<<0<<endl;
continue;
}
while(!q.empty())
q.pop();
q.push(xy{xxx,yyy,0});
while(!q.empty()){
int u=q.front().x;
int v=q.front().y;
int ut=q.front().t;
q.pop();
for(int i=0;i<=3;++i){
int u1=u+mx1[i];
int v1=v+my1[i];
if(vis[u1][v1]==cnt*2-1)
continue;
if(vis[u1][v1]==cnt*2){
f=1;
cout<<ut+1<<endl;
break;
}
if(ma[u1][v1]=='O'){
vis[u1][v1]=cnt*2-1;
q.push((xy){u1,v1,ut+1});
}
}
if(f){
break;
}
}
if(!f){
printf("Poor Harry\n");
}
}
return 0;
}