杭电 2102 A计划

A计划

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 18684    Accepted Submission(s): 4733


Problem Description
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
 

Input
输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。
 

Output
如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。
 

Sample Input
  
  
1 5 5 14 S*#*. .#... ..... ****. ...#. ..*.P #.*.. ***.. ...*. *.#..
 

Sample Output

YES

//这道题并不难,主要在于要注意现在所在层数,用3纬数组做比较方便,因为可以用a[x][y][0]表示第一层,a[x][y][1]表示第二层,当遇到传送门时,1-层数即可到达下一层或上一层还有一点,两边都是传送门时,要单独考虑,将传送门直接变成墙;

#include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<queue> #include<cstdlib> #include<map> #include<iostream> using namespace std; char a[11][11][2]; int b[4][2]={1,0,-1,0,0,-1,0,1}; struct node {     int x,y,z;     int bs; }; int i,j,k; int N,M,T; int ss(int x1,int y1,int z1) {     node ma,mi;     queue<node>q;     ma.x=x1;     ma.y=y1;     ma.z=z1;     ma.bs=0;     q.push(ma);//入口位置入队     while(!q.empty())     {         mi=q.front();         q.pop();//队首出队         a[mi.x][mi.y][mi.z]='*';//标记走过,就直接变成墙         for(i=0;i<4;i++)         {             ma.x=mi.x+b[i][0];             ma.y=mi.y+b[i][1];             ma.z=mi.z;             if(a[ma.x][ma.y][ma.z]=='*')//判断能不能走             continue;             if(ma.x>=0&&ma.x<N&&ma.y>=0&&ma.y<M&&mi.bs<T)//判断是否越界和步数是否超过             {                 if(a[ma.x][ma.y][ma.z]=='#')//遇到传送门                 {                     a[ma.x][ma.y][ma.z]='*';                     ma.z=1-ma.z;//进入下一层                     if(a[ma.x][ma.y][ma.z]=='#')//下一层还是传送门                     {                         a[ma.x][ma.y][ma.z]='*';//标记为墙                     }                     if(a[ma.x][ma.y][ma.z]=='.')//空地入队                     {                         ma.bs=mi.bs+1;                         q.push(ma);                     }                     else if(a[ma.x][ma.y][ma.z]=='P')//找到公主输出YES,并退出搜索                     {                         printf("YES\n");                         return 0;                     }                 }                 else if(a[ma.x][ma.y][ma.z]=='.')//不是传送门空地入队                 {                     ma.bs=mi.bs+1;                     q.push(ma);                 }                 else if(a[ma.x][ma.y][ma.z]=='P')找到公主输出YES,并退出搜索                 {                     printf("YES\n");                     return 0;                 }             }         }     }      printf("NO\n");//没找到公主输出NO,并退出搜索     return -1; } int main() {     int c;     scanf("%d",&c);     while(c--)     {         scanf("%d%d%d",&N,&M,&T);         for(i=0;i<N;i++)         {             for(j=0;j<M;j++)             {                 cin>>a[i][j][0];             }         }         for(i=0;i<N;i++)         {             for(j=0;j<M;j++)             {                 cin>>a[i][j][1];             }         }         ss(0,0,0);     }     return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值