程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 4528 BFS 小明系列故事——捉迷藏

HDU 4528 BFS 小明系列故事——捉迷藏

編輯:C++入門知識

原題直通車: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:\n%d\n",cas++,BFS());  
    }  
    return 0;  
}  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved