【发布时间】:2012-10-15 00:35:36
【问题描述】:
这是我第一次实现 Dijkstra 算法。好的,我有一个简单的 2D 9 x 9 数组:
起点是 1,我们正试图到达任何绿色方块。红色方块是墙壁或熔岩(满足您的想象)。
如何在 Java 中实现这一点?
计算机科学不是我的领域,因此我不是一个经验丰富的程序员,所以我可能不知道如何做一些堆栈推送,只知道循环和递归:(请尽量保持简单并耐心等待!
【问题讨论】:
标签: java shortest-path dijkstra
这是我第一次实现 Dijkstra 算法。好的,我有一个简单的 2D 9 x 9 数组:
起点是 1,我们正试图到达任何绿色方块。红色方块是墙壁或熔岩(满足您的想象)。
如何在 Java 中实现这一点?
计算机科学不是我的领域,因此我不是一个经验丰富的程序员,所以我可能不知道如何做一些堆栈推送,只知道循环和递归:(请尽量保持简单并耐心等待!
【问题讨论】:
标签: java shortest-path dijkstra
这里有一些 similiar 可以帮助您入门。然而,下面提出的解决方案试图到达右下角。您可以放松该条件以找到底行。您还需要稍微更改编码以获得代表该行的唯一值。
public class MazeSolver {
final static int TRIED = 2;
final static int PATH = 3;
// @formatter:off
private static int[][] GRID = {
{ 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1 },
{ 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1 },
{ 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0 },
{ 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1 },
{ 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
};
// @formatter:off
public static void main(String[] args) {
MazeSolver maze = new MazeSolver(GRID);
boolean solved = maze.solve();
System.out.println("Solved: " + solved);
System.out.println(maze.toString());
}
private int[][] grid;
private int height;
private int width;
private int[][] map;
public MazeSolver(int[][] grid) {
this.grid = grid;
this.height = grid.length;
this.width = grid[0].length;
this.map = new int[height][width];
}
public boolean solve() {
return traverse(0,0);
}
private boolean traverse(int i, int j) {
if (!isValid(i,j)) {
return false;
}
if ( isEnd(i, j) ) {
map[i][j] = PATH;
return true;
} else {
map[i][j] = TRIED;
}
// North
if (traverse(i - 1, j)) {
map[i-1][j] = PATH;
return true;
}
// East
if (traverse(i, j + 1)) {
map[i][j + 1] = PATH;
return true;
}
// South
if (traverse(i + 1, j)) {
map[i + 1][j] = PATH;
return true;
}
// West
if (traverse(i, j - 1)) {
map[i][j - 1] = PATH;
return true;
}
return false;
}
private boolean isEnd(int i, int j) {
return i == height - 1 && j == width - 1;
}
private boolean isValid(int i, int j) {
if (inRange(i, j) && isOpen(i, j) && !isTried(i, j)) {
return true;
}
return false;
}
private boolean isOpen(int i, int j) {
return grid[i][j] == 1;
}
private boolean isTried(int i, int j) {
return map[i][j] == TRIED;
}
private boolean inRange(int i, int j) {
return inHeight(i) && inWidth(j);
}
private boolean inHeight(int i) {
return i >= 0 && i < height;
}
private boolean inWidth(int j) {
return j >= 0 && j < width;
}
public String toString() {
String s = "";
for (int[] row : map) {
s += Arrays.toString(row) + "\n";
}
return s;
}
}
【讨论】:
我建议您先在这里用自然语言写下一种应用 dijkstras 算法(假设您首先知道它)的方法,然后开始将其转换为您的编程语言。
您需要回答的基本问题:
一旦你这样做了,你应该能够找到一个(可能不是有效的)解决方案。
【讨论】: