zoukankan      html  css  js  c++  java
  • 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;
    } 
    
  • 相关阅读:
    operator[],识别读操作和写操作
    COW写时复制
    嵌套类,PIMPL
    类型转换
    String类运算符重载,自己实现
    socket的几个配置函数
    TCP三次握手,四次挥手,状态变迁图
    运算符重载
    友元
    P4016 负载平衡问题(最小费用最大流)
  • 原文地址:https://www.cnblogs.com/For-Miku/p/13770171.html
Copyright © 2011-2022 走看看