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

Dynamically Update Elements of Array (Based on Changes Made to its Other Elements)

所以,我有一个表面裂缝的二维向量,没有特定的顺序排列。如果一个裂缝太靠近另一个裂缝(比方说 3 个单位),一个或两个裂缝必须平移开(最多 8 个单位)。 B 型裂缝(已识别)将不会被修改。到目前为止,我的程序具有沿着或垂直于它们的等式线平移裂缝的功能。

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

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

您可以将以下结构用作表面块

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

然后你可以通过以下方式标记任何有裂缝的方块:

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

另外,你可以在你的裂缝周围创建一个 "territory",它会充满带有

的方块
surf[x][y]->crack 

即指向导致它不可用的破解的指针(如果免费则为 NULL)

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