【问题标题】:Removing reciprocal references from a 2D array从二维数组中删除相互引用
【发布时间】:2011-10-19 13:53:48
【问题描述】:

我有一个二维数组,例如:

[
    [0, 1], // collisionGroup0's references
    [0, 1, 2], // collisionGroup1's references
    [0, 1], // collisionGroup2's references
];

这个数组为我的游戏引擎定义了一个碰撞贴图。所以想象我有 3 个碰撞组。从这个数组中,我可以看出以下几点:

collisionGroup0 与collisionGroup0 和collisionGroup1 发生碰撞。

collisionGroup1 与collisionGroup0、collisionGroup1 和collisionGroup2 发生碰撞。

collisionGroup2 与collisionGroup0 和collisionGroup1 发生碰撞。

我希望这是有道理的。

好的,那么问题来了:

我正在寻找一种方法来循环并删除相互引用。由于collisionGroup0 与collisionGroup1 碰撞,并且collisionGroup1 与collisionGroup0 碰撞,我们只需要一个引用。否则,当我进行实际的碰撞检查时,我们(现在在我的引擎中发生的情况)碰撞会加倍。

我希望最终的数组在处理后看起来像这样:

[
    [0, 1], // collisionGroup0's references
    [2], // collisionGroup1's references
    [0, 1], // collisionGroup2's references
];

我现在的样子是这样的:

for (var row : int = 0; row < array.length; ++row)
{
    for (var column : int = 0; column < array[row].length; ++column)
    {
        for (var row2 : int = row + 1; row2 < array.length; ++row2)
        {
            for (var column2 : int = array[row2].length - 1; column2 >= 0; --column2)
            {
                if (array[row][column] == array[row2][column2])
                    array[row2].splice(column2, 1);
            }
        }
    }
}

但这给我留下了这个:

[
    [0, 1], // collisionGroup0's references
    [2], // collisionGroup1's references
    [], // collisionGroup2's references
];

因为它没有考虑到collisionGroup2 与collisionGroup0 不互易的事实。

任何想法我错过了什么?

谢谢!

【问题讨论】:

    标签: arrays algorithm language-agnostic multidimensional-array


    【解决方案1】:

    摆脱碰撞目标的索引大于当前索引的任何碰撞。因此,例如,摆脱下面的**家伙

    [
    [0, **1**], // collisionGroup0's references
    [0, 1, **2**], // collisionGroup1's references
    [0, 1], // collisionGroup2's references
    ];
    

    因为 1 > 0 和 2 > 1。 你可以做相反的事情——但如果它们是有序的,就像例子中一样,这样你最终会截断数组,这可能比砍掉它们的头更快更容易。

    我假设相互引用总是在那里。如果没有,那就没用了!

    【讨论】:

      猜你喜欢
      • 2018-12-26
      • 2021-06-26
      • 1970-01-01
      • 2023-03-31
      • 2019-08-05
      • 2017-11-06
      • 2012-01-21
      • 2015-06-08
      • 1970-01-01
      相关资源
      最近更新 更多