首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Dijkstra算法的二维数组中的最短路径?

使用Dijkstra算法的二维数组中的最短路径?
EN

Stack Overflow用户
提问于 2012-10-15 00:35:36
回答 3查看 25.8K关注 0票数 3

这是我第一次实现Dijkstra的算法。好的,这里我有一个简单的2D9×9数组:

起点是1,我们正试图到达任何一个绿色广场。红色方块是墙或熔岩(任何满足你想象的东西)。

如何在Java中实现这一点?

计算机科学不是我的领域,所以我不是一个经验丰富的程序员,所以我可能不知道如何做一些堆栈推,只循环和递归:(请保持它容易,并容忍我!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-15 00:52:29

下面是一些相似应该让你开始的东西。然而,下面介绍的解决方案试图到达右下角。你可以放松这个条件,找到最下面的一行。您还需要稍微更改编码,使其具有表示此行的唯一值。

代码语言:javascript
复制
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;
    }

}
票数 6
EN

Stack Overflow用户

发布于 2012-10-15 00:45:02

我建议您从在自然语言中使用dijkstras算法(假设您首先知道)的方法开始,然后开始将其转换为您的编程语言。

你需要回答的基本问题如下:

  • 节点是什么?
  • 这些联系是什么?
  • 每个连接的重量是多少?

一旦您这样做,您应该能够找到一个(可能不是有效的)解决方案。

票数 3
EN

Stack Overflow用户

发布于 2012-10-15 09:13:17

最优的解决方案确实是使用不同的完成条件的迪克斯特拉或AStar。所以您需要编写if(targetNodes.contains(u)) break;而不是if(target == u) break;

(参见wikipedia:如果我们只对顶点源和目标之间的最短路径感兴趣,那么如果u= target,我们可以在第13行终止搜索。)

这已经在我的项目“.哦,这是作业吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12887921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档