【问题标题】:Dynamically Update Elements of Array (Based on Changes Made to its Other Elements)动态更新数组元素(基于对其其他元素所做的更改)
【发布时间】:2017-04-12 06:32:53
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    此外,您可以在裂缝周围创建一个“领土”,其中充满了带有

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

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

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

    【讨论】:

    • 代替指针,您可以选择使用两个整数作为裂纹的坐标,如果为空则为 -1
    • 我认为实现这一点是个好主意,因为裂缝是从 XML 中读取的。通过查看读入的每个裂缝,所有裂缝都将在到达最后一个裂缝时计算在内。感谢您帮助我意识到这一点。
    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    相关资源
    最近更新 更多