HDU2102 A计划 (基础BFS)

来源:互联网 发布:电脑打电话软件下载 编辑:程序博客网 时间:2024/05/16 19:35

题意:中文,不解释,但是要注意一点的是,传送门后面是墙或者还是传送门,那么这条路是不可行的

#include<iostream>#include<cstdlib>#include<cmath>#include<algorithm>#include<cstring>#include<cstdio>#include<queue>#include<set>#include<stack>#define cl(a,b) memset(a,b,sizeof(a));#define LL long long#define P pair<int,int>#define X first#define Y second#define pb push_back#define out(x) cout<<x<<endl;using namespace std;const int maxn=15;const int inf=9999999;int n,m,t;char   a[2][maxn][maxn];bool vis[2][maxn][maxn];struct node{    int x,y;    bool level;//在图的层次    int step;    node(){}    node(int a,int b,int c,int d):level(a),x(b),y(c),step(d){}};int dir[][2]={1,0,0,1,-1,0,0,-1};int bfs(){    cl(vis,false);    queue<node> q;    q.push(node(0,0,0,0));    vis[0][0][0]=true;    while(!q.empty()){        node tmp=q.front();q.pop();        for(int i=0;i<4;i++){            node s=tmp;            s.x+=dir[i][0];            s.y+=dir[i][1];            s.step++;            if(a[s.level][s.x][s.y]=='#'&&(a[!s.level][s.x][s.y]=='*'||a[!s.level][s.x][s.y]=='#'))continue;            if(a[s.level][s.x][s.y]=='#'&&a[!s.level][s.x][s.y]!='*'&&a[!s.level][s.x][s.y]!='#'){                s.level=!s.level;//遇到传送门,就传送了            }            if(s.x<0||s.x>=n||s.y<0||s.y>=m||a[s.level][s.x][s.y]=='*')continue;            if(vis[s.level][s.x][s.y])continue;            if(a[s.level][s.x][s.y]=='P'){                return s.step;            }            vis[s.level][s.x][s.y]=true;            q.push(s);        }    }    return -1;}int main(){    int T;    scanf("%d",&T);    int cas=1;    while(T--){        scanf("%d%d%d",&n,&m,&t);        for(int i=0;i<n;i++){            scanf("%s",a[0][i]);        }        for(int i=0;i<n;i++){            scanf("%s",a[1][i]);        }        int ans=bfs();        //printf("ans = %d\n",ans);        if(ans==-1||ans>t){            puts("NO");        }        else {            puts("YES");        }    }    return 0;}
0 0
原创粉丝点击