C++ 标记 3D 对象数组中的连续部分

标签 c++ arrays multithreading recursion multidimensional-array

如果我们有一个 3x3x3 的对象数组,它包含两个成员:一个 bool 值和一个整数;谁能建议一种基于 bool 值将此数组标记为连续 block 的有效方法。 例如,如果我们将它描绘成一个 Rubix 立方体,并且缺少中间切片(1,x,x == false 上的所有内容),我们是否可以通过唯一的组标识符将两个外部切片标记为单独的组int 成员。

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

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

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

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

最佳答案

可以这样做:

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;
    }
}

关于C++ 标记 3D 对象数组中的连续部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8551017/

相关文章:

javascript - JavaScript数组计算和转换

c++ - 在 QThread::run 中间调用一个槽

C++ 如何阻止负数作为参数传递,其中需要无符号

c++ - 我在哪里可以获得适用于 Qt 5.1.0 或 Qt 5.1.1 的兼容 NCreport 库

c++ - 如何使用 sys/mount 挂载 NFS 系统?

c++ - 如何修复 MSVC++(Microsoft Visual Studio)中与 "macro overloading"相关的可变参数宏相关问题?

arrays - 当状态是对象数组时如何更新特定值 - React

wpf - UserControl XAML 中缺少数组元素?

python - 函数调用无延迟

multithreading - Postgresql事务 "COMMIT"线程安全吗?