题解 | #迷宫问题#

迷宫问题

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

/**
 * 广度优先搜索(BFS)
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) {
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        StringBuffer route = new StringBuffer();
        String a;
        int[] lines = new int[2];
        int[][] matrix;
        int i = 0, m, n, step = 0;
        try {
            a = r.readLine();
            char[] dim = a.toCharArray();
            splits(lines, dim);//获得矩阵行数和列数
            m = lines[0];
            n = lines[1];
            matrix = new int[m][n];
            while ((a = r.readLine()) != null && !a.isEmpty()) {
                splits(matrix[i++], a.toCharArray());//将输入数据存入矩阵
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        int[][] ans = new int[m * n][2];
        i = 0;
        if (trace(matrix, ans, 0, 0, step)) {
            while (ans[i][0] != m - 1 || ans[i][1] != n - 1) {//表示已到达右下角
                a = "(" + ans[i][0] + "," + ans[i][1] + ")\n";
                route.append(a);
                i++;
            }
            a = "(" + ans[i][0] + "," + ans[i][1] + ")\n";
            route.append(a);
            System.out.print(route);
        }
    }

    //按空格分割字符串
    public static void splits(int[] arr, char[] chs) {
        int i = 0, j = 0, k = 0, l = chs.length, n = 0;
        while (i < l) {
            if (chs[i] == ' ') {
                if (k > 0) arr[j++] = n;
                n = 0;
                i++;
                continue;
            }
            k++;
            n *= 10;
            n += chs[i] - '0';
            if (i == l - 1) arr[j] = n;
            i++;
        }
    }

    //多线程编程时,静态变量的访问容易出现锁死
    public static boolean trace(int[][] matrix, int[][] ans, int i, int j,
                                int step) {
        ans[step][0] = i;//先将该步(迷宫矩阵下标索引)存入路径
        ans[step][1] = j;//先将该步(迷宫矩阵下标索引)存入路径
        step++;//步数递增
        int row = matrix.length - 1;
        int col = matrix[0].length - 1;
        if (i == row &&
                j == col) return true;//到达终点右下角,输出路径,返回true
        matrix[i][j] =
            1;//迷宫没有到达右下角,继续走下去,并且已走过的该位设为1,避免重复往回走
        if (j > 0 && matrix[i][j - 1] == 0 &&
                trace(matrix, ans, i, j - 1, step)) return true;//向左走
        if (j < col && matrix[i][j + 1] == 0 &&
                trace(matrix, ans, i, j + 1, step)) return true;//向右走
        if (i > 0 && matrix[i - 1][j] == 0 &&
                trace(matrix, ans, i - 1, j, step)) return true; //向上走
        if (i < row && matrix[i + 1][j] == 0 &&
                trace(matrix, ans, i + 1, j, step)) return true; //向下走
        matrix[i][j] = 0;//不行就重新将迷宫走过的该位置置为0
        return false;//返回false,表示该方案不行
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
醉蟀:你是我今年见过的最美牛客女孩
点赞 评论 收藏
分享
03-24 00:03
门头沟学院 Java
恶龙战士:实习经历写的不行,需要改,不管是改成主业务还是主技术都可以
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务