动态更新数组元素(基于对其他元素的更改)

时间:2017-04-12 06:32:53

标签: c++ search vector dynamic-programming algebra

所以,我在表面上有一个裂缝的二维矢量,没有特定的顺序排列。如果裂缝太靠近另一个裂缝(假设3个单位),则必须将一个或两个裂缝平移掉(最多8个单位)。 B型裂缝(已确定)将不予修改。到目前为止,我的程序具有将裂缝沿着或垂直于它们的等式线转换的功能。

当我将裂缝从另一个裂缝中移开时,问题就出现了,它变得太接近另一个不同的第三个裂缝了。这需要第二次翻译,如果问题没有解决,也需要第三次翻译。但这会得到计算密集型。如果在第一次迭代时移动278个裂缝,然后在第二次迭代上移动另外278个裂缝,并且再次在第三次移动时移动,那么在翻译之前已经计算了277 ^ 3 = 21,253,933(对于每个裂缝,必须计算到277个其他裂缝的距离) 。现在并不总是需要翻译所有278个裂缝,但我需要一个更好的算法来移动所有裂缝,使它们彼此相距至少3个单位。即使我尝试使用动态搜索邻域,它仍然需要遍历所有278个裂缝。

请指教;我被困住了,我真的不知道如何继续。

1 个答案:

答案 0 :(得分:0)

您可以使用以下结构作为表面块

struct Square{
bool occupied;
Square *crack;
};

然后你可以用以下标记占据任何有裂缝的方格:

surf[x][y].occupied = true;

此外,您可以创建一个"领土"在你的裂缝周围,这将充满了

surf[x][y]->crack 

即。指向导致它不可用的裂缝的指针(如果空闲则为NULL)

因此,当你开始游戏时,你可以简单地开始为每个裂缝构建领土,直到冲突发生(领土已被占领),在这种情况下,你可以移开裂缝(不要忘记移动它的领土)。 因此,您只需检查裂缝是否在另一个区域内,如果是,则应移动它(只需搜索周围的空方块)。当成功移动到空方格(或超过移动限制)时,您现在可以创建自己的区域。如果在建造领土时你遇到了一个已经有领土的广场,只需使用指针移动它(及其领土)。这将有助于您不需要将每个裂缝与所有其他裂缝进行比较,从而使该过程更加高效。此外,如果您不想多次移动裂缝,您可以跟踪它是否已被另一个布尔值移动,并且您可以确定最佳方向。只是抛出一些想法。希望这有帮助!