zoukankan      html  css  js  c++  java
  • HDU 4528 BFS 小明系列故事——捉迷藏

    原题直通车:HDU 4528 小明系列故事——捉迷藏

    分析: 标记时加两种状态就行.

    代码:

    #include<iostream>
    #include<cstring>
    #include<queue>
    #include<cstdio>
    using namespace std;
    
    const int maxn=101;
    char f[maxn][maxn];
    int dx[]={0,0,-1,1};
    int dy[]={1,-1,0,0};
    bool vis[maxn][maxn][2][2];
    int n,m,k,ei,ej,di,dj,si,sj;
    struct node{
        int x,y,time,p,q;
    }rt,ne;
    void work(node &rt){
        bool u;
        if(!rt.p&&rt.x==ei){
            int a=min(rt.y,ej), b=max(rt.y,ej);
            u=false;
            for(int i=a+1;i<b;++i)
                if(f[ei][i]!='.') u=true;
            if(!u)rt.p=1;
        }
        if(!rt.p&&rt.y==ej){
            int a=min(rt.x,ei), b=max(rt.x,ei);
            u=false;
            for(int i=a+1;i<b;++i)
                if(f[i][ej]!='.') u=true;
            if(!u)rt.p=1;
        }
        if(!rt.q&&rt.x==di){
            int a=min(rt.y,dj), b=max(rt.y,dj);
            u=false;
            for(int i=a+1;i<b;++i)
                if(f[di][i]!='.')u=true;
            if(!u)rt.q=1;
        }
        if(!rt.q&&rt.y==dj){
            int a=min(rt.x,di), b=max(rt.x,di);
            u=false;
            for(int i=a+1;i<b;++i)
                if(f[i][dj]!='.') u=true;
            if(!u)rt.q=1;
        }
    }
    int BFS(){
        queue<node>M;
        rt.x=si, rt.y=sj, rt.time=0, rt.p=0, rt.q=0;
        vis[si][sj][0][0]=true;
        M.push(rt);
        while(!M.empty()){
            rt=M.front(); M.pop();
            work(rt);
            if(rt.p&&rt.q) return rt.time;
            for(int i=0;i<4;++i){
                ne=rt; ne.x+=dx[i]; ne.y+=dy[i]; ne.time+=1;
                if(ne.x<0||ne.x>=n||ne.y<0||ne.y>=m||ne.time>k||f[ne.x][ne.y]!='.') continue;
                if(!vis[ne.x][ne.y][ne.p][ne.q]){
                    M.push(ne);
                    vis[ne.x][ne.y][ne.p][ne.q]=true;
                }
            }
        }
        return -1;
    }
    int main(){
        int T,i,j,t,u,cas=1; scanf("%d",&T);
        while(T--){
            scanf("%d%d%d",&n,&m,&k);
            for(i=0;i<n;++i){
                scanf("%s",f[i]);
                for(j=0;j<m;++j){
                    if(f[i][j]=='S') si=i, sj=j,f[i][j]='.';
                    if(f[i][j]=='E') ei=i, ej=j;
                    if(f[i][j]=='D') di=i, dj=j;
                    for(t=0;t<2;++t)
                        for(u=0;u<2;++u)
                            vis[i][j][t][u]=false;
                }
            }
            printf("Case %d:
    %d
    ",cas++,BFS());
        }
        return 0;
    }
    



  • 相关阅读:
    UML类图和用例图
    设计模式基本原则
    c# 协变和逆变
    git本地忽略
    计算器科学概论-数据操控
    计算机科学概论-数据存储
    docker部署gitlab-ce
    sqlserver2008R2 本地不能用localhost连接
    Redis常用命令
    C# 值类型和引用类型的区别
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3258055.html
Copyright © 2011-2022 走看看