• OpenJudge 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

    还以为是个起终点各自BFS的题,做了一半觉得不对,开始看题(才开始看题233)。

    原来就是个裸BFS,心情复杂……

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 using namespace std;
     7 int mx[5]={0,1,0,-1,0},
     8     my[5]={0,0,1,0,-1};
     9 int m,n;
    10 char mp[300][300];
    11 int sx,sy;
    12 int vis[300][300];
    13 //queue
    14 struct que{
    15     int x,y;
    16     int dis;
    17 }q[200000];
    18 //
    19 void BFS(){
    20     memset(vis,0,sizeof vis);
    21     int hd=0,tl=1;
    22     q[++hd]=(que){sx,sy,0};
    23     while(hd<=tl){
    24         que now=q[hd];
    25         for(int i=1;i<=4;i++){
    26             int nx=now.x+mx[i];
    27             int ny=now.y+my[i];
    28             if(nx<=0 || nx>m || ny<=0 || ny>n)continue;
    29             if(vis[nx][ny])continue;
    30             if(mp[nx][ny]=='#')continue;
    31             if(mp[nx][ny]=='*'){
    32                 printf("%d
    ",now.dis+1);
    33                 return;
    34             }
    35             vis[nx][ny]=1;
    36             q[++tl]=(que){nx,ny,now.dis+1};
    37         }
    38         hd++;
    39     }
    40     printf("-1
    ");
    41     return;
    42 }
    43 int main(){
    44     while(scanf("%d%d",&m,&n) && m && n){
    45         int i,j;
    46         bool flag=0;
    47         for(i=1;i<=m;i++){
    48             scanf("%s",mp[i]+1);
    49             if(!flag)for(j=1;j<=n;j++){
    50                 if(mp[i][j]=='@'){
    51                     sx=i;sy=j;
    52                     flag=1;
    53                     break;
    54                 }
    55             }
    56         }
    57         BFS();
    58     }
    59     return 0;
    60 }
  • 相关阅读:
    mybatis中大于等于小于等于的写法
    RandomAccess接口
    ArrayList源码解析
    使用Docker搭建MySQL主从复制(一主一从)
    狂神Docker视频学习笔记(基础篇)
    【JQ】jQuery实现将div中滚动条滚动到指定位置的方法
    JAVA线程池的基本使用
    史上最全的Java技术体系思维导图,没有之一!
    springboot整合kafka
    spring cloud alibaba 分布式事务解决方案之seata-1.3.0
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5766661.html
Copyright © 2020-2023  润新知