zoukankan      html  css  js  c++  java
  • noi 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<queue>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 using namespace std;
     7 struct abd 
     8 {
     9     int x;
    10     int y,step;
    11 } cur,nxt;
    12 queue<abd>que;
    13 int mp[25][25];
    14 bool v[25][25];
    15 int moe[5] = {1,0,-1,0,1};
    16 int n,m,li[2];
    17 int tox,toy;
    18 void bfs(int xx,int xy) 
    19 {
    20     while(!que.empty())que.pop();
    21     memset(v,0,sizeof(v));
    22     cur.x=xx;
    23     cur.y=xy;
    24     cur.step=0;
    25     que.push(cur);
    26     v[xx][xy]=1;
    27     while(!que.empty()) 
    28     {
    29         cur=que.front();
    30         que.pop();
    31         for(int i=0; i<4; i++) 
    32         {
    33             int xxx=cur.x+moe[i];
    34             int yyy=cur.y+moe[i+1];
    35             if(xxx==tox&&yyy==toy) 
    36             {
    37                 cout<<cur.step+1<<endl;
    38                 return;
    39             } 
    40             else if(xxx<=n&&xxx>=1&&yyy>=1&&yyy<=m&&!mp[xxx][yyy]&&!v[xxx][yyy]) 
    41             {
    42                 nxt.x=xxx;
    43                 nxt.y=yyy;
    44                 nxt.step=cur.step+1;
    45                 v[xxx][yyy]=1;
    46                 que.push(nxt);
    47             }
    48         }
    49     }
    50     cout<<-1<<endl;
    51 }
    52 int main() {
    53     string a;
    54     while(cin>>n>>m) 
    55     {
    56         if(n==0&&m==0)break;
    57         for(int i=1; i<=n; i++) 
    58         {
    59             cin>>a;
    60             for(int j=0; j<a.size(); j++) 
    61             {
    62                 switch(a[j])
    63                 {
    64                     case '.' :mp[i][j+1]=0;
    65                         break;
    66                     case '#' :mp[i][j+1]=2;    break;
    67                     case '*' :mp[i][j+1]=0;tox=i;toy=j+1;break;
    68                     case '@' :mp[i][j+1]=3;li[0]=i;li[1]=j+1;break;
    69                 }
    70             }
    71         }
    72         bfs(li[0],li[1]);
    73     }
    74     return 0;
    75 }
  • 相关阅读:
    Kubernetes之network: failed to set bridge addr: "cni0" already has an IP address different from xxx问题
    k8s的存储Volume
    系统漏洞扫描与分析软件
    linux图形化安装oracle
    JMX监控tomcat jdbc pool
    Hyper-V
    苹果手机
    读书
    clickhouse count
    clickhouse分布式表
  • 原文地址:https://www.cnblogs.com/sssy/p/6758500.html
Copyright © 2011-2022 走看看