首页 > 试题广场 >

【米兔走迷宫】 问题描述: 一只米兔不小心被传送到了一个长方

[问答题]
【米兔走迷宫】
问题描述: 
一只米兔不小心被传送到了一个长方形迷宫里,它需要尽快找到传送点逃离迷宫。由于米兔吃的太胖,不能从两块迷宫墙之间的缝隙穿过去, 所以我们认为米兔只能向上下左右道路上移动。求米兔从当前位置出发到传送点的最短距离。 

输入描述: 
输入数据的第一行 为两个整数(W和H),分别代表迷宫的宽高。W和H均不会超过20。接下来有H行,每行W个字符,字符的含义为: '.':道路 '#':墙 '@':道路上站了只米兔(每组数据中只会出现一次) '$':传送点 (每组数据中只会出现一次,且与米兔的初始位置一定是连通的) 

输出描述: 
输出米兔到达传送点的最短距离(包括它初始时所在的位置和传送点) 

输入样例:
11 9 
.#......... 
.#.#######. 
.#.#.....#. 
.#.#.###.#. 
.#.#..@#.#. 
.#.#####.#. 
.#.......#. 
.#.#######. 
..........$ 

输出样例:
 29

图片说明

import java.util.Scanner;

public class Main5 {
    static int cnt=999;
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //宽
        int width = sc.nextInt();
        //长
        int length = sc.nextInt();
        //存图
        char[][] map = new char[length][width];
        //记录是否走过
        boolean[][] used = new boolean[length][width];
        //获取输入
        String[] str = new String[length];
        for(int i = 0 ; i < length ; i++){
            str[i] = sc.next();
        }

      //记录答案
        int ans=1;
        int idx = 0,idy = 0;
        for(int i = 0 ; i < length ; i++){
            for(int j = 0 ; j < width ; j++){
                used[i][j] = false;
                //找到兔子的起点
                map[i][j] = str[i].charAt(j);
                if(map[i][j] == '@'){
                    idx = i;
                    idy = j;
                }
            }
        }
        pr(width,length,map,used);
        //搜索
        backTrace(map,idx,idy,used,ans);
        System.out.println(cnt);
    }
    private static void pr(int width, int length, char[][] map, boolean[][] used) {
        for(int i = 0 ; i < length ; i++){
            for(int j = 0 ; j < width ; j++){
                System.out.print(map[i][j]);
            }
            System.out.println();
        }
        System.out.println();
    }
    public static void backTrace(char[][] map , int i , int j , boolean[][] used,int ans){

        int length = map.length;
        int width = map[0].length;
        //越界检查  不能是墙#  不能已经走过
        if((i < 0 || i >= length || j < 0 || j >= width || map[i][j] == '#' || used[i][j]) == true){
            return ;
        }
        //如果是路,步数++,并记录为已走过
        if(map[i][j] == '.'||map[i][j]=='@'){
            System.out.println(ans+" "+i+"  "+j);
            ans++;
            used[i][j] = true;
        }
        //如果是终点,说明找到答案
        if(map[i][j] == '$'){
            System.out.println(ans+" "+i+"  "+j);
            if(cnt>ans)
                cnt=ans;
            return ;
        }
        backTrace(map,i - 1,j,used,ans);
        backTrace(map,i + 1,j,used,ans);
        backTrace(map,i,j - 1,used,ans);
        backTrace(map,i,j + 1,used,ans);
        used[i][j] = false;
    }
}
发表于 2022-08-23 21:21:55 回复(0)