走迷宮

題目描述

  NowCoder最喜歡遊樂場的迷宮遊戲,他和小夥伴們比賽誰先走出迷宮。
  如今把迷宮的地圖給你,你能幫他算出最快走出迷宮須要多少步嗎?java

1.1 輸入描述:

  輸入包含多組數據。
  每組數據包含一個10*10,由「#」和「.」組成的迷宮。其中「#」表明牆;「.」表明通路。
  入口在第一行第二列;出口在最後一行第九列。
  從任意一個「.」點都能一步走到上下左右四個方向的「.」點。算法

1.2 輸出描述:

  對應每組數據,輸出從入口到出口最短鬚要幾步。spa

1.3 輸入例子:

#.########
#........#
#........#
#........#
#........#
#........#
#........#
#........#
#........#
########.#

#.########
#........#
########.#
#........#
#.########
#........#
########.#
#........#
#.######.#
########.#

 

1.4 輸出例子:

16
30

 

2 解題思路

  由於題意是使用最少的步數走出迷宮,所要可使用廣度優先遍歷的方式,每處理完一層說明走了一步,最早到達出口使用的步數最少。根據輸入的例子,迷宮的走法如圖1所示。
這裏寫圖片描述
圖1 迷宮找最短路徑code

3 算法實現

import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Scanner;

/**
 * Declaration: All Rights Reserved !!!
 */
public class Main {
    private final static int N = 10;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));

        while (scanner.hasNextLine()) {
            char[][] maze = new char[N][N];
            for (int i = 0; i < N; i++) {
                maze[i] = scanner.nextLine().toCharArray();
            }

            System.out.println(minStep(maze));
        }

        scanner.close();
    }

    /**
     * 求使用最少的步驟走出迷宮,迷宮大小固定爲10*10,起點爲(0, 1),終點爲(9, 8)
     *
     * @param maze 迷宮
     * @return 走出迷宮最少的步數,走不出去返回-1
     */
    private static int minStep(char[][] maze) {

        // 記錄當前處理層的位置
        Queue<Integer> curr = new ArrayDeque<>(N * N);
        // 記錄下一層處理的位置
        Queue<Integer> next = new ArrayDeque<>(N * N);

        // 能夠移動的四個方向,兩個一組
        int[] d = {1, 0, 0, 1, -1, 0, 0, -1};

        // 添加起點;
        curr.add(0);
        curr.add(1);
        int x;
        int y;
        // 記錄最少的步數
        int step = 0;

        while (!curr.isEmpty()) {
            x = curr.remove();
            y = curr.remove();

            // 找到終點位置
            if (x == 9 && y == 8) {
                return step;
            }

            // 處理(x, y)位置的四個方向
            for (int i = 0; i < d.length; i += 2) {
                int t = x + d[i];
                int v = y + d[i + 1];
                if (t >= 0 && t < N && v >= 0 && v < N && maze[t][v] == '.') {
                    // 標記已經訪問過
                    maze[t][v] = '#';
                    // 訪問的位置添加到隊列中
                    next.add(t);
                    next.add(v);
                }
            }

            // 當前層已經處理完
            if (curr.isEmpty()) {
                // 步數加一
                step++;
                // 處理下一層
                Queue<Integer> temp = curr;
                curr = next;
                next = temp;
            }

        }

        // 執行到此說明找不到出路
        return -1;
    }
}
相關文章
相關標籤/搜索