DFS+回溯轻松解决迷宫问题!最优雅最清楚的代码!!!

迷宫问题

https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc

import java.util.Scanner;

import java.util.ArrayList;

import java.io.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        //BufferedReader in = new Bufferedreader(new InputStreamReader(System.in));
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int m = in.nextInt();
            int n = in.nextInt();
            int[][] maze = new int[m][n];
            for (int i = 0; i < m; i++) { //行
                for (int j = 0; j < n; j++) {
                    //map记录整个迷宫
                    maze[i][j] = in.nextInt();
                }
            }
            dfs5(maze, new int[] {0, 0}, new int[] {maze.length - 1, maze[0].length - 1},
                 list);
            for (int[] arr : list) {
                System.out.println("(" + arr[0] + "," + arr[1] + ")");
            }
        }
    }
    public static ArrayList<int[]> list = new ArrayList<>();
    public static void dfs5(int[][]maze, int[] start, int[] des,
                            ArrayList<int[]> path) {

        if (start[0] == des[0] && start[1] == des[1]) {
            path.add(new int[] {maze.length - 1, maze[0].length - 1});
            list = new ArrayList<>(path);
            return;
        }
        int l = start[1] - 1;
        int r = start[1] + 1;
        int u = start[0] - 1;
        int d = start[0] + 1;

        maze[start[0]][start[1]] = -1;
        path.add(new int[] {start[0], start[1]});
        if (l >= 0 && maze[start[0]][l] == 0) {
            dfs5(maze, new int[] {start[0], l}, des, path);
        }
        if (r < maze[0].length && maze[start[0]][r] == 0) {
            dfs5(maze, new int[] {start[0], r}, des, path);
        }
        if (u >= 0 && maze[u][start[1]] == 0) {
            dfs5(maze, new int[] {u, start[1]}, des, path);
        }
        if (d < maze.length && maze[d][start[1]] == 0) {
            dfs5(maze, new int[] {d, start[1]}, des, path);
        }
        maze[start[0]][start[1]] = 0;
        path.remove(path.size() - 1);
    }
}

全部评论

相关推荐

10-30 10:16
南京大学 Java
龚至诚:给南大✌️跪了
点赞 评论 收藏
分享
10-11 17:30
湖南大学 C++
我已成为0offer的糕手:羡慕
点赞 评论 收藏
分享
昨天 17:48
中山大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务