Shortest path in 2d arrays

前端 未结 3 865
暗喜
暗喜 2020-12-19 15:31
*...*..D
.G..*.....
**...**.
.S....*.
........
...G**..
........
.G..*...

Here is 2d array where
S- Source
D-Destination
G-Point must be

3条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-19 15:55

    To find the shortest distance from start point to all other points in the map, you can use a BFS. Sample code:

    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 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));
                    }
                }
            }
        }
    

    The second path of the problem is actually a traveling salesman problem, so you need to convert from your original graph to a graph which only contains G,D and S points, with the weight of each edge in this graph is the shortest path between them in original path. From that onward, if the number of G is small (less than 17) you can use dynamic programming and bitmask to solve the problem.

提交回复
热议问题