zoukankan      html  css  js  c++  java
  • [OpenJudge] 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

    正常的bfs,注意起点终点和memset。

    //Writer:GhostCai && His Yellow Duck
    
    #include<iostream>
    #include<queue>
    #include<cstring>
    #define MAXN 22
    using namespace std;
    
    int m,n;
    int ans=-1;
    int a[MAXN][MAXN];
    bool vis[MAXN][MAXN];
    int aimx,aimy,sx,sy;
    
    int dx[4]={0,1,0,-1};
    int dy[4]={1,0,-1,0};
    
    struct point{
        int x,y,step;
    }node,r;
    
    void bfs(int x,int y){
        bool flag=0;
        vis[x][y]=1;
        queue<point> Q;
        node.x = x;
        node.y = y;
        node.step = 0;
        Q.push(node);
        while(!Q.empty()&&!flag ){
            r=Q.front() ;
            Q.pop() ;
            int i;
            for(i=0;i<=3;i++){
                int nx=r.x + dx[i];
                int ny=r.y + dy[i];
                if(nx<1||nx>m||ny<1||ny>n) continue;
                if(a[nx][ny]=='#'||vis[nx][ny]) continue;
                vis[nx][ny]=1;
                node.x = nx;
                node.y = ny;
                node.step  = r.step + 1;
                Q.push(node);
                if(a[nx][ny]=='*') {
                    ans=node.step ;
                    flag=1;
                }
            }
        } 
    }
    
    int main(){
        int i,j;
        while(1){
            char z[25];
            cin>>m>>n;
            memset(vis,0,sizeof(vis));
            memset(a,0,sizeof(a));
            if(m==0&&n==0) return 0;
            for(i=1;i<=m;i++){
                scanf("%s",z);
                for(j=1;j<=n;j++){
                    a[i][j]=z[j-1];
                    if(a[i][j]=='@') sx=i,sy=j;
                    if(a[i][j]=='*') aimx=i,aimy=j;
                }
            }
    
            bfs(sx,sy);
            cout<<ans<<endl;
            ans=-1;
        }
        return 0;
    }
    

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247539.html

  • 相关阅读:
    新购服务器流程
    nginx代理证书使用方法
    一键部署lnmp脚本
    mysql主从库配置读写分离以及备份
    Linux入门教程(更新完毕)
    Git 工作流程
    Git远程操作
    常用Git命令
    js数组去重
    Sublime Text设置快捷键让html文件在浏览器打开
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247539.html
Copyright © 2011-2022 走看看