P2199 最后的迷宫

Miku

对于每一个数据,扩展哪些点能看见奖杯,然后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
");
        }   
    }
    return 0;
} 
原文地址:https://www.cnblogs.com/For-Miku/p/13770171.html