【问题标题】:C++ Mark for contiguous sections in a 3D array of objectsC++ 标记 3D 对象数组中的连续部分
【发布时间】:2012-01-22 23:23:15
【问题描述】:

如果我们有一个 3x3x3 的对象数组,其中包含两个成员:一个布尔值和一个整数;任何人都可以根据布尔值建议一种将这个数组标记为连续块的有效方法。 例如,如果我们把它想象成一个 Rubix 立方体,并且缺少一个中间切片(1,x,x == false 上的所有内容),我们是否可以通过唯一的组标识符将两个外部切片标记为单独的组int 成员。

如果“切片”经过 90 度,留下 L 形和条形,则同样需要应用。

是否可以使用递归来处理非常大的 3D 数组?可以穿线吗。

到目前为止,我已经敲了几次字,但最终陷入了一些死胡同和堆栈溢出。

非常感谢任何帮助,谢谢。

【问题讨论】:

    标签: c++ arrays multithreading recursion multidimensional-array


    【解决方案1】:

    可以这样做:

    struct A {int m_i; bool m_b;};
    enum {ELimit = 3};
    int neighbour_offsets_positive[3] = {1, ELimit, ELimit*ELimit};
    
    A cube[ELimit][ELimit][ELimit];
    A * first = &cube[0][0][0];
    A * last = &cube[ELimit-1][ELimit-1][ELimit-1];
    
    // Init 'cube'.
    for(A * it = first; it <= last; ++it)
        it->m_i = 0, it->m_b = true;
    
    // Slice.
    for(int i = 0; i != ELimit; ++i)
        for(int j = 0; j != ELimit; ++j)
            cube[1][i][j].m_b = false;
    
    // Assign unique ids to coherent parts.
    int id = 0;
    for(A * it = first; it <= last; ++it)
    {
        if (it->m_b == false)
            continue;
        if (it->m_i == 0)
            it->m_i = ++id;
        for (int k = 0; k != 3; ++k)
        {
            A * neighbour = it + neighbour_offsets_positive[k];
            if (neighbour <= last)
                if (neighbour->m_b == true)
                    neighbour->m_i = it->m_i;
        }
    }
    

    【讨论】:

    • 非常感谢。我会实施它,看看它的进展情况并报告。
    【解决方案2】:

    如果我正确理解术语“连续块”,即所有那些数组元素的最大集合,其中每个顶点到所有其他顶点都有一条路径并且它们都共享相同的布尔值,那么这是一个问题finding connected components in a graph 可以通过简单的DFS 完成。想象一下,每个数组元素都是一个顶点,当且仅当 1)它们共享相同的布尔值 2)它们仅相差一个坐标并且该差的绝对值是 1(即它们是相邻的)时,两个顶点才会连接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      相关资源
      最近更新 更多