这是关于改变迷宫算法。
我的意思是什么?我们得到了一个填充0和1的二维数组,其中0代表“不可能通过”,1代表“可能通过”。 该算法从x到y找到它的方式(也称为例如:cat to mouse)。 这正是以下算法正在做的事情。
作为输入我们得到了:
{1, 0, 0,},
{1, 1, 0},
{0, 1, 1} };
输出:
(0,0) // ressembles the coordinates of the 1 in top left corner
(1,0) // ressembles the 1 under the first 1 I just explained
(1,1) // ...
(2,1)
(2,2)
我想改变一些小事:
需要做哪些更改,我很确定,但我不知道如何编写代码: 对于1.)问题似乎是:
public List<Coordinate> solve() {
return getMazePath(0, 0, new Stack<Coordinate>());
}
不知何故,我需要用第二个0做0-1但是如果我没有访问x和y声明怎么办?我真的相信0-1会让我从左下角而不是左上角开始,是吗?
对于2.)列的更改,也称为y需要完成。 它需要-1而不是+1,是吗?
对不起那段文字,我真的试着保持简短,但我似乎失败了:P 无论如何,我希望有人会读到这个^^
没有变化的算法:
import java.util.Arrays;
import java.util.*;
final class Coordinate {
private final int x;
private final int y;
public Coordinate(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
public class Alg {
private final int[][] maze;
public Alg(int[][] maze) {
if (maze == null) {
throw new NullPointerException("The input maze cannot be null");
}
if (maze.length == 0) {
throw new IllegalArgumentException("The size of maze should be greater than 0");
}
this.maze = maze;
}
public List<Coordinate> solve() {
return getMazePath(0, 0, new Stack<Coordinate>());
}
private List<Coordinate> getMazePath(int row, int col, Stack<Coordinate> stack) {
assert stack != null;
stack.add(new Coordinate(row, col));
if ((row == maze.length - 1) && (col == maze[0].length - 1)) {
Coordinate[] coordinateArray = stack.toArray(new Coordinate[stack.size()]);
return Arrays.asList(coordinateArray);
}
for (int j = col; j < maze[row].length; j++) {
if ((j + 1) < maze[row].length && maze[row][j + 1] == 1) {
return getMazePath(row, j + 1, stack);
}
if ((row + 1) < maze.length && maze[row + 1][col] == 1) {
return getMazePath(row + 1, col, stack);
}
}
return Collections.emptyList();
}
public static void main(String[] args) {
int[][] m = { {1, 0, 0,},
{1, 1, 0},
{0, 1, 1} };
Alg maze = new Alg(m);
for (Coordinate coord : maze.solve()) {
System.out.println("("+coord.getX() + "," + coord.getY()+")");
}
}
}
答案 0 :(得分:0)
查看getMazePath
的方法声明。当前的0,0作为row
和col
传递给该参数。因此,不是向当前编码的方法发送0,0,而是发送2,0(对于第2行,第0列,左下角)。
方向移动位于for
方法内的getMazePath()
循环中,两个if语句检查列j + 1
中是否有1(右边的列)或行row + 1
(当前行下方的行)。您可以修改那些使用减号而不是加号来分别向左或向上移动。