深度遍历生成迷宫,关于两行代码的顺序问题

来源:6-3 深度优先遍历生成迷宫

甲骨文_0001

2017-09-30

http://szimg.mukewang.com/59ce6f550001595817280817.jpg

http://szimg.mukewang.com/59ce6f9e0001c3ab09900772.jpg

http://szimg.mukewang.com/59ce6f9e0001efa811630796.jpg


写回答

1回答

liuyubobobo

2017-09-30

如果采用我的代码结构,耐心等待绘制的最终完成,应该也是一条通路的。只不过联通会在最后发生,因为相当于是使用了后序遍历,先通过go去遍历,最后才将当前节点和访问的下一个节点之间的通路打通。


如果你的代码在最终绘制不是联通的,应该是你的draw的位置有问题。draw应该发生在你的map修改以后。我看你的代码draw发生在每次go调用中,这是不合适的。go只是一个逻辑过程。而draw其实是显示反映数据的变化,应该是绘制数据一旦发生变化(你的代码中map一旦发生变化),就进行draw操作。试试看:)


另外,为了保险起见,在整个动画逻辑完成以后也应该执行一下draw:)请再体会一下我的代码逻辑,注意我加注释的部分。

private void run(){
    // 在动画逻辑开始之前,先绘制一遍初始状态
    setData(-1, -1);  
    
    // 动画逻辑
    go(data.getEntranceX(), data.getEntranceY()+1); 
    
    // 在动画逻辑之后,绘制一遍最终状态,虽然在一些情况下是多余的:) 
    setData(-1, -1);  
}

private void go(int x, int y){
    if(!data.inArea(x,y))
        throw new IllegalArgumentException("x,y are out of index in go function!");
    
    data.visited[x][y] = true;
    for(int i = 0 ; i < 4 ; i ++){
        int newX = x + d[i][0]*2;
        int newY = y + d[i][1]*2;
        if(data.inArea(newX, newY) && !data.visited[newX][newY]){
            // setData是修改数据,同时绘制!这两个动作绑定在一起!
            // 每次显示数据一发生修改,说明我们的画面要产生变化,就进行一次绘制:)
            setData(x + d[i][0], y + d[i][1]);
            
            // 之后继续根据我们的逻辑遍历相关节点
            go(newX, newY);
        }
    }
}




1
1
甲骨文_0001
谢谢 应该是我的draw没在最后map改变后绘制,其实map数据已经迷宫生成了 感谢波波老师的提示(^ ^)
2017-09-30
共1条回复

7个经典应用诠释Java算法精髓

课程重应用、重实践、重思维,真正应用于实际工作开发中

1888 学习 · 112 问题

查看课程