你得到了一个MXN阵列。9号是奶酪,0号是墙,1号是路你就是鼠标,从左上角开始a[0][0]。你需要知道有没有通向奶酪的路。这就是我被问到的问题。我试着用某种方法解决它,我想知道是否有人能告诉我它是正确的还是走在正确的道路上,因为我有点一时冲动,在考试中没有时间了。
我的想法是,如果你知道你从左上角开始,那么你只需要向下和向右移动,如果数组看起来是这样的:

1 0 0 0
1 1 0 0
0 1 1 9
0 0 0 0

所以左上角是1,这意味着存在一条路径,所以我所做的是在左、右相邻的单元提供的左上角递归,生成2个子数组。所以我在这两个子数组上调用了ispath方法
0 0 0
1 0 0
1 1 9
0 0 0

然后
1 1 0 0
0 1 1 9
0 0 0 0

方法的基本版本如下:
isPath(int[][] matrix) {
    if(matrix[0][0] == 0)
        return 0;
    if(matrix[0][0] == 9)
        return 1; //found
    if(matrix[0][0] == 1) {
        subarray1 = copy starting from matrix[0][1]
        subarray2 = copy starting from matrix[1][0]
        isPath(subarray1)
        isPath(subarray2)
    }
}

这是解决这个问题的正确方法吗?或者我错过了什么
编辑:没有助手方法

最佳答案

我想你忘了这样的排列:

1 0 0 9
1 1 0 1
0 1 1 1
0 0 0 1

您的递归函数在上一个示例中无法完成,请检查数组的大小以完成递归。
而且你的算法也没有用在寻找奶酪上
编辑
你应该处理4个方向,不要重复你之前访问过的正方形,我将在这里添加伪代码来解释解决方案的主要思想:
public class MAZE {

    static int x, y;
    static boolean result = false;

    public static void main(String[] args) {
        int [][] matrix =new int[5][];// fill your array
        // fill x and y
        // x= cheese x value
        // y = cheese y value
        isPath(matrix, x, x);
        // print result


    }

    static void isPath(int[][] matrix, int i, int j) {
        if (i - 1 > -1 && matrix[i - 1][j] == 1) {
            // subarray1 = copy starting from [0][0] to matrix[i-1][j]
            // checkSPath(subarray1,i-1,j);
        }
        if (j - 1 > -1 &&  matrix[i][j - 1] == 1) {
            // subarray1 = copy starting from [0][0] to matrix[i][j-1]
            // checkLPath(subarray1,i,j-1);
        }

        if (i + 1 < x && matrix[i + 1][j] == 1) {
            // subarray1 = copy starting from [0][0] to matrix[i+1][j]
            // checkNPath(subarray1,i+1,j);
        }
        if (j + 1 < y &&  matrix[i][j + 1] == 1) {
            // subarray1 = copy starting from [0][0] to matrix[i][j+1]
            // checkRPath(subarray1,i,j+1);
        }
    }

    static void checkRPath(int[][] matrix, int i, int j) {
        if (i == 0 && j == 0) {
            result = true;
        } else {
            if (i - 1 > -1 && matrix[i - 1][j] == 1) {
                // subarray1 = copy starting from [0][0] to matrix[i-1][j]
                // checkSPath(subarray1,i-1,j);
            }

            if (i + 1 < x && matrix[i + 1][j] == 1) {
                // subarray1 = copy starting from [0][0] to matrix[i+1][j]
                // checkNPath(subarray1,i+1,j);
            }
            if (j + 1 < y && matrix[i][j + 1] == 1) {
                // subarray1 = copy starting from [0][0] to matrix[i][j+1]
                // checkRPath(subarray1,i,j+1);
            }
        }
    }

    static void checkLPath(int[][] matrix, int i, int j) {

        if (i == 0 && j == 0) {
            result = true;
        } else {
            if (i - 1 > -1 && matrix[i - 1][j] == 1) {
                // subarray1 = copy starting from [0][0] to matrix[i-1][j]
                // checkSPath(subarray1,i-1,j);
            }
            if (j - 1 > -1 && matrix[i][j - 1] == 1) {
                // subarray1 = copy starting from [0][0] to matrix[i][j-1]
                // checkLPath(subarray1,i,j-1);
            }

            if (i + 1 < x && matrix[i + 1][j] == 1) {
                // subarray1 = copy starting from [0][0] to matrix[i+1][j]
                // checkNPath(subarray1,i+1,j);
            }
        }
    }

    static void checkNPath(int[][] matrix, int i, int j) {
        if (i == 0 && j == 0) {
            result = true;
        } else {
            if (j - 1 > -1 && matrix[i][j - 1] == 1) {
                // subarray1 = copy starting from [0][0] to matrix[i][j-1]
                // checkLPath(subarray1,i,j-1);
            }

            if (i + 1 < x && matrix[i + 1][j] == 1) {
                // subarray1 = copy starting from [0][0] to matrix[i+1][j]
                // checkNPath(subarray1,i+1,j);
            }
            if (j + 1 < y && matrix[i][j + 1] == 1) {
                // subarray1 = copy starting from [0][0] to matrix[i][j+1]
                // checkRPath(subarray1,i,j+1);
            }
        }

    }

    static void checkSPath(int[][] matrix, int i, int j) {
        if (i == 0 && j == 0) {
            result = true;
        } else {
            if (i - 1 > -1 && matrix[i - 1][j] == 1) {
                // subarray1 = copy starting from [0][0] to matrix[i-1][j]
                // checkSPath(subarray1,i-1,j);
            }
            if (j - 1 > -1 && matrix[i][j - 1] == 1) {
                // subarray1 = copy starting from [0][0] to matrix[i][j-1]
                // checkLPath(subarray1);
            }

            if (j + 1 < y && matrix[i][j + 1] == 1) {
                // subarray1 = copy starting from [0][0] to matrix[i][j+1]
                // checkRPath(subarray1);
            }
        }
    }
}

你可以把这5种方法合并在一起。在这里,我试图解释不编写优化代码的解决方案。

关于java - 在阵列迷宫中找到“奶酪”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31633229/

10-10 10:08