hdu 2012 A计划 BFS

来源:互联网 发布:java调用scala 编辑:程序博客网 时间:2024/06/16 09:43

思路:
注意坑点,就是两个传送门再两层同个位置,那是不能走的,无限传送!!!!把这里弄成两个墙就好了还有把那个能撞死人的传送门也弄成墙!!!

#include<cstring>#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>#include<queue>#include<vector>using namespace std;#define LL long long#define INF 0x3f3f3f3fchar mp[2][12][12];int vis[2][12][12];int T,n,m,kase;int sz,sx,sy,tz,tx,ty;int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0};struct node{    int z,x,y,t;    node(int _z,int _x,int _y,int _t):z(_z),x(_x),y(_y),t(_t){}};int BFS(){    memset(vis,0,sizeof(vis));    node s(sz,sx,sy,0);    //s.z=sz;s.x=sx;s.y=sy;s.t=0;    queue<node>Q;    Q.push(s);    while(!Q.empty()){        node t=Q.front();        Q.pop();        int nz=t.z,nx=t.x,ny=t.y,nt=t.t;        if(nt>T)return 0;        if(nz==tz&&nx==tx&&ny==ty)return 1;        vis[nz][nx][ny]=1;        for(int i=0;i<4;i++){            int gx=nx+dx[i],gy=ny+dy[i];            if(gx<0||gx>=n||gy<0||gy>=m||vis[nz][gx][gy]||mp[nz][gx][gy]=='*')continue;            if(mp[nz][gx][gy]=='#'){                vis[nz][gx][gy]=1;                if(vis[!nz][gx][gy])continue;                Q.push(node(!nz,gx,gy,nt+1));            }            else Q.push(node(nz,gx,gy,nt+1));        }    }    return 0;}int main(){    scanf("%d",&kase);    while(kase--){        scanf("%d%d%d",&n,&m,&T);        for(int i=0;i<2;i++){            for(int j=0;j<n;j++){                scanf("%s",mp[i][j]);            }        }        for(int i=0;i<2;i++){            for(int j=0;j<n;j++){                for(int k=0;k<m;k++){                    if(mp[i][j][k]=='#'&&(mp[!i][j][k]=='*'||mp[!i][j][k]=='#')){                        mp[!i][j][k]=mp[i][j][k]='*';                    }                    if(mp[i][j][k]=='S'){                        sz=i;sx=j;sy=k;                    }                    if(mp[i][j][k]=='P'){                        tz=i;tx=j;ty=k;                    }                }            }        }        if(BFS())printf("YES\n");        else printf("NO\n");    }    return 0;}
0 0
原创粉丝点击