我的探路者在找到最短路径时遇到了问题

时间:2010-06-29 21:17:54

标签: java recursion path-finding

我遇到了一个探路者的问题(这是我的第一次,所以这是预期的):它并不总是采用最短路径。例如,如果我想向下一个方格,路径将是:一个方格左边,一个下边,一个右边。

public void getSquares(){
        actPath = new String[Map.x][Map.y];
        isDone = new boolean[Map.x][Map.y];
        squareListener = new SquareListener[Map.x][Map.y];
        getSquares2(x,y,0,new String());
    }
    public void getSquares2(int x, int y, int movesused, String path){
        boolean test1 = false;
        boolean test2 = false;
        test1 = (x < 0 || y < 0 || x > Map.x || y > Map.y);
        if(!test1){
            test2 = Map.landTile[y][x].masterID != 11;
        }
        if(movesused <= 6 && (test1 || test2)){
            addMoveSquare2(x,y, path);
            getSquares2(x+1,y,movesused+1,path+"r");
            getSquares2(x,y+1,movesused+1,path+"d");
            getSquares2(x,y-1,movesused+1,path+"u");
            getSquares2(x-1,y,movesused+1,path+"l");
        }
    }
    public void addMoveSquare2(int x, int y, String path){
        if(x >= 0 && y>=0 && x < Map.x && y < Map.y && (actPath[x][y] == null || actPath[x][y].length() > path.length())){
            if(squareListener[x][y] == null){
                actPath[x][y] = new String();
                actPath[x][y] = path;
                JLabel square = new JLabel();
                square.setBounds(x*16,y*16,16,16);
                square.setIcon(moveSquare);
                squareListener[x][y] = new SquareListener(x,y,path);
                square.addMouseListener(squareListener[x][y]);
                Map.cases.add(square);
            }
            else{
                squareListener[x][y].path = path;
            }
        }
    }

SquareListener是一个简单的MouseListener,用于打印方块的位置及其路径。 Map.x,Map.y是地图大小。 用起点调用getSquares2,绘制每个6步移动的正方形,并考虑每个值为“11”的情况作为障碍物。

你能帮我找一些我做错的事吗?

以下是结果的屏幕截图: http://img808.imageshack.us/img808/96/screen.gif 红色方块是可能的目标。只有当玩家点击一个方格时才会定义真实的一个(MouseListener是SquareListener,它应该知道要采取的路径)。房屋是价值“11”的案件,障碍物。

3 个答案:

答案 0 :(得分:2)

您的算法看起来几乎正确。差不多,因为在找到节点的第二条路径时忘记分配actPath[x][y],所以使用actPath[x][y]的长度检查不正确。你应该这样做:

        else{
            actPath[x][y] = path;             
            squareListener[x][y].path = path;
        }

你的算法也有令人憎恶的时间复杂度,因为它将迭代所有长度为6的路径(所有4 ^ 6 = 4096)而不是最短路径(6 * 6 + 5 * 5 = 61)

为了获得灵感,我建议查看Dijkstra's algorithm(A *的前身),它设法只访问最短路径,并在路径长度为小整数时以O(可达节点数)结束,因为它案例在这里。

答案 1 :(得分:0)

您可能对tutorial上的A* search algorithm感兴趣。

答案 2 :(得分:0)

您可以使用A-Star的示例代码查看我的回答here,而不是直接回答,但代码是可读的,它会指向一本好书(处理许多其他内容)发现。我从来没有开始评论代码......

不确定你的意思,在丹尼尔的评论中,“谢谢你的链接,但是,我没有一个目标,只有很多动作,这可以实现很多目标。”