2d数组中的最短路径

时间:2014-08-20 02:21:20

标签: java arrays algorithm shortest-path

*...*..D
.G..*.....
**...**.
.S....*.
........
...G**..
........
.G..*...

这是2d数组所在的位置
S-源
D目的地
必须访问G点。“。”自由路径
“*”块路径
你能帮忙吗?我将在java中找到最短路径长度的有效算法。只有水平和垂直运动才有可能

3 个答案:

答案 0 :(得分:3)

要查找从start点到地图中所有其他点的最短距离,您可以使用BFS。 示例代码:

public void visit(String []map , Point start){
        int []x = {0,0,1,-1};//This represent 4 directions right, left, down , up
        int []y = {1,-1,0,0};
        LinkedList<Point> q = new LinkedList();
        q.add(start);
        int n = map.length;
        int m = map[0].length();
        int[][]dist = new int[n][m];
        for(int []a : dist){
            Arrays.fill(a,-1);
        }
        dist[start.x][start.y] = 0;
        while(!q.isEmpty()){
            Point p = q.removeFirst();
            for(int i = 0; i < 4; i++){
                int a = p.x + x[i];
                int b = p.y + y[i];
                if(a >= 0 && b >= 0 && a < n && b < m && dist[a][b] == -1 && map[a].charAt(b) != '*' ){
                    dist[a][b] = 1 + dist[p.x][p.y];
                    q.add(new Point(a,b));
                }
            }
        }
    }

问题的第二个路径实际上是traveling salesman problem,因此您需要将原始图表转换为only contains G,D and S points的图表,并在此图表中使用每个边缘的weightshortest path between them in original path。从那时起,如果G的数量很小(小于17),您可以使用dynamic programming and bitmask来解决问题。

答案 1 :(得分:2)

这里有许多算法,如dijkstra或BFS,但如果你需要学习路径寻找算法,那么我建议A* algorithm,因为它比dijkstra或BFS更快,并且可以很容易地在2D矩阵上实现。 如果必须访问节点,您可以尝试访问节点的所有序列,例如说S->G1->G2->G3->D找到此路径的最小值为min(S,G1)+min(S,G2)+min(G3,D)。尝试G's的所有排列,并尽量减少所有排列。

答案 2 :(得分:1)

这是一个简单的广度优先搜索算法问题。这称为泛洪填充技术,它是一种广度优先搜索算法。从here.读取它你也可以从here.学习基本广度优先算法。这也可以通过其他技术解决,如Dijkstra或Floyd warshal。但广度优先搜索更容易理解。