【问题标题】:Need to traverse matrix-like graph in expanding concentric squares扩展同心正方形需要遍历类矩阵图
【发布时间】:2010-03-05 19:57:37
【问题描述】:

好的,我有一个由链接节点矩阵组成的数据结构,比如说 10x10。我希望能够任意选择这些节点中的任何一个,并且 - 从那里 - 按照扩展同心正方形的模式处理许多周围的节点(为了说明目的,我在下面使用了较少的节点)。就细节而言,实施将在 Actionscript 中 - 但随时用另一种语言回答 :) - 它适用于扫雷游戏(特别是如果点击一块没有地雷的方块,他们 - 全部- 清除不规则形状,直至周围的地雷)。它也将是基于事件的 - 为遍历的每个节点调度一个,所以我想象的方式是,当迭代器或其他任何东西遇到包含地雷的字段时,遍历将停止朝该方向进一步前进,而其余的将继续。这些节点与它们的顶部、右侧、底部和左侧邻居双重链接,如果需要,我不会反对添加更多链接。可能还有其他方法可以做到这一点,但我可以想到这种解决方案的多种用途,并希望将其包含在我正在创建的框架中,所以我想放弃一些我可以重用的东西.

第一:
0 0 0 0 0
0 0 0 0 0
0 0 X 0 0
0 0 0 0 0
0 0 0 0 0

秒:
0 0 0 0 0
0 X X X 0
0 X 0 X 0
0 X X X 0
0 0 0 0 0

第三个:
X X X X X
X 0 0 0 X
X 0 0 0 X
X 0 0 0 X
X X X X X

【问题讨论】:

    标签: c++ actionscript graph data-structures tree


    【解决方案1】:
    function scan( x, y ){
        queue toDo;
        set queued;
    
        toDo.push( x, y );
        queued.add( x, y );
        while ( !toDo.empty() ) {
            (x, y) = toDo.removeHead();
    
            if ( process( x, y ) != stop ) {
                for( xp = -1; xp <= 1; ++xp ) {
                    for( yp = -1; yp <= 1; ++yp ) {
                        if ( !queued.contains( x+xp, y+yp ) ) {
                            toDo.push( x+xp, y+yp );
                            queued.add( x+xp, y+yp );
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 请原谅我的无知,但这是什么语言? x,y 是否引用矩阵中的坐标,因为它实际上不是基于索引的东西,而是链表。也许我可以翻译这段代码,我只是对 (x,y) = 等这些语法约定有点不熟悉......
    • 哦,好酷 - 我明白了。谢谢 :) 我将发布我对其所做的修改,以便它在带有链接对象而不是基于索引的对象的动作脚本中工作。
    • 是的,抱歉,我对一个我可以回答的问题感到兴奋,我没有遵守您的问题细节。我上面的代码是更多的伪代码,而不是真正的语言。为了使它真正遵循扩展的方形图案,您需要在对角线上进行链接,或者您需要在队列中存储另一条信息以指示从哪个方向扫描空间,以便它知道哪个方向向外移动。 (我还在大学里建立了自己的扫雷器,我认为我使用了数组矩阵,因此我的解决方案使用索引来访问它)。很高兴你能理解。
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多