在数组迷宫中找到 "cheese"
Finding the "cheese" in an array maze
你得到了一个 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 种方法合二为一。在这里,我试图解释不编写优化代码的解决方案。
你得到了一个 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 种方法合二为一。在这里,我试图解释不编写优化代码的解决方案。