zoukankan      html  css  js  c++  java
  • HDU 2102 A计划(BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102

    题目大意:公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。

    解题思路:em....还是bfs,只是可以通过‘#’上下传送,其他都差不多。需要注意:当传送过去是‘*’(墙),或者传送过去是‘#’(传送机)这两种都算是传送失败了。

    代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 using namespace std;
     5 const int N=15;
     6 
     7 int m,n,T;
     8 int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
     9 char map[N][N][5];
    10 int vis[N][N][5];
    11 
    12 struct node{
    13     int x,y,z,step;
    14 }pre,now;
    15 
    16 bool bfs(){
    17     queue<node>q;
    18     now.x=now.y=now.z=1;
    19     now.step=0;
    20     q.push(now);
    21     while(!q.empty()){
    22         pre=q.front();
    23         q.pop();
    24         for(int i=0;i<4;i++){
    25             int xx=pre.x+d[i][0];
    26             int yy=pre.y+d[i][1];
    27             int zz=pre.z;
    28             int t=pre.step+1;
    29             if(xx<1||yy<1||zz<1||xx>n||yy>m||zz>2||vis[xx][yy][zz]||map[xx][yy][zz]=='*')
    30                 continue;
    31             vis[xx][yy][zz]=1;
    32             if(map[xx][yy][zz]=='#'){
    33                 if(zz==1)
    34                     zz++;
    35                 else
    36                     zz--;
    37                 //注意除了墙,如果另一层是传送机也不行,传来传去无限循环啊~ 
    38                 if(vis[xx][yy][zz]||map[xx][yy][zz]=='*'||map[xx][yy][zz]=='#')
    39                     continue;
    40                 vis[xx][yy][zz]=1;                            
    41             }
    42             if(map[xx][yy][zz]=='P'){
    43                 if(t<=T)
    44                     return true;
    45                 return false;
    46             }
    47             now.x=xx;
    48             now.y=yy;
    49             now.z=zz;
    50             now.step=t;
    51             q.push(now);                    
    52         }
    53     }
    54     return false;
    55 }
    56 
    57 int main(){
    58     int t;
    59     scanf("%d",&t);
    60     while(t--){
    61         memset(vis,0,sizeof(vis));
    62         scanf("%d%d%d",&n,&m,&T);
    63         for(int k=1;k<=2;k++){
    64             if(k!=1)
    65                 getchar();
    66             for(int i=1;i<=n;i++){
    67                 getchar();
    68                 for(int j=1;j<=m;j++){
    69                     scanf("%c",&map[i][j][k]);
    70                 }
    71             }
    72         }
    73         if(bfs())
    74             puts("YES");
    75         else
    76             puts("NO");
    77     }
    78     return 0;
    79 }
  • 相关阅读:
    Base64编码原理分析
    对 js 高程 Preflighted Reqeusts 的理解
    js 跨域 之 修改服务器配置-XAMPP-Apache (nginx 拉到最后!)
    js 模拟 select 的 click 事件
    串讲-解释篇:作用域,作用域链,执行环境,变量对象,活动对象,闭包
    js 匿名函数-立即调用的函数表达式
    Java I/O流输入输出,序列化,NIO,NIO.2
    Java8Lambda表达式
    设计模式之适配器模式
    设计模式之装饰器设计模式
  • 原文地址:https://www.cnblogs.com/fu3638/p/7529225.html
Copyright © 2011-2022 走看看