zoukankan      html  css  js  c++  java
  • 2727:仙岛求药(广搜)

    2727:仙岛求药

    总时间限制:
    1000ms
    内存限制:
    65536kB
    描述
    少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。
    下图 显示了一个迷阵的样例及李逍遥找到仙药的路线.
    输入
    输入有多组测试数据. 每组测试数据以两个非零整数 M 和 N 开始,两者均不大于20。M 表示迷阵行数, N 表示迷阵列数。接下来有 M 行, 每行包含N个字符,不同字符分别代表不同含义:
    1) ‘@’:少年李逍遥所在的位置;
    2) ‘.’:可以安全通行的方格;
    3) ‘#’:有怪物的方格;
    4) ‘*’:仙药所在位置。
    当在一行中读入的是两个零时,表示输入结束。
    输出
    对于每组测试数据,分别输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1。
    样例输入
    8 8
    .@##...#
    #....#.#
    #.#.##..
    ..#.###.
    #.#...#.
    ..###.#.
    ...#.*..
    .#...###
    6 5
    .*.#.
    .#...
    ..##.
    .....
    .#...
    ....@
    9 6
    .#..#. 
    .#.*.# 
    .####. 
    ..#... 
    ..#... 
    ..#... 
    ..#... 
    #.@.## 
    .#..#. 
    0 0
    
    样例输出
    10
    8
    -1

    思路:广搜。
     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<queue>
     5 using namespace std;
     6 struct node{
     7     int h,z,step;
     8 }cur,net;
     9 queue<node>s;
    10 char a;
    11 int map[30][30];
    12 bool vis[30][30];
    13 int d[5]={1,0,-1,0,1};
    14 int n,m;
    15 int sx,sy,ex,ey;
    16 void bfs()
    17 {
    18     if(sx==ex&&sy==ey)
    19     {
    20         printf("0
    ");return ;
    21     }
    22     while(!s.empty())s.pop(); 
    23     cur.h=sx;
    24     cur.z=sy;
    25     cur.step=0;
    26     s.push(cur);
    27     vis[cur.h][cur.z]=1;
    28     while(!s.empty() )
    29     {
    30         cur=s.front() ;
    31         s.pop() ;
    32         for(int i=0;i<4;++i)
    33         {
    34             int xx=cur.h +d[i]; 
    35             int yy=cur.z +d[i+1];
    36             if(xx>0&&yy>0&&xx<=n&&yy<=m&&map[xx][yy]!=1&&!vis[xx][yy])
    37             {
    38                 if(xx==ex&&yy==ey)
    39                 {
    40                     printf("%d
    ",cur.step+1);
    41                     return ;
    42                 }
    43                 net.h=xx;
    44                 net.z=yy;
    45                 net.step=cur.step+1;
    46                 vis[xx][yy]=1;
    47                 s.push(net); 
    48             }
    49         }
    50     }
    51     printf("-1
    ");
    52 }
    53 int main()
    54 {
    55     scanf("%d%d",&n,&m);
    56     while(n!=0&&m!=0)
    57     {
    58         memset(vis,0,sizeof(vis));
    59         memset(map,0,sizeof(map));
    60         for(int i=1;i<=n;++i)
    61             for(int j=1;j<=m;++j)
    62             {
    63                 cin>>a;
    64                 if(a=='@'){sx=i;sy=j;}
    65                 else if(a=='*'){ex=i;ey=j;}
    66                 else if(a=='#'){map[i][j]=1;}
    67             }
    68         bfs();
    69         scanf("%d%d",&n,&m);
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    post和get请求
    博客开通了
    【树形动态规划】【CTSC1997】选课 解题报告
    【动态规划】天堂(Heaven) 解题报告
    [NOIP2013]积木大赛
    [树状数组+逆序对][NOIP2013]火柴排队
    [快速幂][NOIP2012]转圈游戏
    [前缀和+二分]借教室
    [字符串]TrBBnsformBBtion
    [NOIP2012]国王游戏
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6758401.html
Copyright © 2011-2022 走看看