zoukankan      html  css  js  c++  java
  • Java实现 计蒜客 1251 仙岛求药

    仙岛求药

    少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由 M imes NM×N 个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。

    输入格式
    第一行输入两个非零整数 MM 和 NN,两者均不大于 2020。MM 表示迷阵行数, NN 表示迷阵列数。

    接下来有 MM 行, 每行包含 NN 个字符,不同字符分别代表不同含义:

    1. ‘@’:少年李逍遥所在的位置;2) ‘.’:可以安全通行的方格;3) ‘#’:有怪物的方格;4) ‘*’:仙药所在位置。

    输出格式
    输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1−1。

    输出时每行末尾的多余空格,不影响答案正确性

    样例输入1

    8 8
    .@##...#
    #....#.#
    #.#.##..
    ..#.###.
    #.#...#.
    ..###.#.
    ...#.*..
    .#...###
    

    样例输出1
    10
    样例输入2

    6 5
    .*.#.
    .#...
    ..##.
    .....
    .#...
    ....@
    

    样例输出2
    8
    样例输入3

    9 6
    .#..#. 
    .#.*.# 
    .####. 
    ..#... 
    ..#... 
    ..#... 
    ..#... 
    #.@.## 
    .#..#.
    

    样例输出3
    -1

     
    
    import java.util.LinkedList;
    import java.util.Scanner;
    
    public class 仙岛求药 {
    
    
     static int N = 3000;//N需开大点
        static   int r,c;
      static   char[] []  map = new char[N][N];//用于保存地图
        static boolean  [] [] vis = new  boolean[N][N];//标识是否访问过的点
        static  int [] []dir = {{-1,0},{1,0},{0,-1},{0,1}}; //四个方向坐标
      static   class node{
            int x;
            int y;
            int step;
        }
        static  node []  q = new node[N];
    public static     void bfs(int sx,int sy,int ex,int ey){
            int head=1,tail=1;
            boolean flag1 =true;
            vis[sx][sy]=true;
            node n = new node();
            n.x=sx;
            n.y=sy;
            n.step=0;
        q[tail]=n;
            tail++;
            while(head<tail){
                int x = q[head].x;
                int y = q[head].y;
                int step = q[head].step;
                if(x==ex&&y==ey) //终点则输出
                {
                    flag1=false;
                    System.out.printf("%d
    ",step);
                    break;
                }
                for(int i=0;i<4;i++){
                    int nx = x+ dir[i][0];
                    int ny = y +dir[i][1];
                    if(nx >= 0 && nx < r && ny >= 0 && ny < c && vis[nx][ny] == false && map[nx][ny] == '.'){
                        vis[nx][ny] = true;
                        node nn;
                        if (q[tail]==null){
                             nn =new node();
                        }
                        else {
                              nn = q[tail];
                        }
    
                        nn.x = nx;
                        nn.y = ny;
                        nn.step = step+1;
                        q[tail]=nn;
                        tail++;
                    }
                }
                head++;
            }
            if(flag1)
                System.out.printf("-1
    ");
        }
    
        public static void main(String[] args) {
            int sx = 0,sy=0,ex=0,ey=0;
          //  while(scanf("%d%d",&r,&c) != EOF && (r||c))
            Scanner sc = new Scanner(System.in);
              r = sc.nextInt();
              c = sc.nextInt();
            for (int k=0;k<r;k++){
    
    String s = sc.next();
    map[k]=s.toCharArray();
            }
                for(int i=0;i<r;i++)
                    for(int j=0;j<c;j++)
                    {
                        if(map[i][j]=='@'){
                            sx=i;
                            sy=j;
                        }
                        if(map[i][j]=='*'){
                            ex=i;
                            ey=j;
                            map[i][j]='.';//修改为 点
                        }
                    }
                bfs(sx,sy,ex,ey);
    
        }
     
    }
    
    
  • 相关阅读:
    送股分红是怎么回事?
    基金申购费用计算
    msn 爬楼梯
    沪市证券交易费用
    OS X
    见到郎咸平:)
    Long long time_Blog更新了
    生~气:)
    突然想起去年的今天
    久久沉思以后
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13076131.html
Copyright © 2011-2022 走看看