【问题标题】:convert 3d array to 2d array in C++在 C++ 中将 3d 数组转换为 2d 数组
【发布时间】:2012-12-01 23:25:51
【问题描述】:

我有一个 3d 数组,它基本上是 9 个定义为 100x100 的 2d 数组块,它们将在 3x3 网格中排列。我想把这个 3D 数组转换成一个 2D 数组。

array[9][100][100]需要转为array[900][900]

有什么想法可以解决这个问题吗?

[编辑]

所以我将减少计数以使其更易于管理。我将使用数组[9][5][5];

如果我初始化数组并打印到文件中,使用下面的答案我不会得到我期望的结果。鉴于我的初始化方式,我期望和想要的是一个看起来像这样的文件:

000001111122222
000001111122222
000001111122222
000001111122222
000001111122222
333334444455555
333334444455555
333334444455555
333334444455555
333334444455555
666667777788888
666667777788888
666667777788888
666667777788888
666667777788888

所以我将值与第一个维度联系起来。它给了我 9 个象限的二维数组。这是我想要的布局。所以第一个维度实际上是定义应该放置其他两个维度的象限。所以重点是每个象限 2D 数组都将保存 tile id 来绘制我们的地图。我想这样做是因为玩家将从中心(第 4 象限)开始,但是当他移动到第 5 象限时,服务器(它是一个 MMO)会看到它移到了中心象限之外的右侧,所以它'将需要发送更多地图数据的整个右侧象限。

基本上它会发送一个新的 2、5 和 8 象限的地图数据。我会让他们相应地移动 3D 数组(此时很容易。只需移动整个象限),然后在客户端上转换为 2D 数组,以便我可以轻松找到我需要绘制的 2D 地图的哪个子部分因为我可以通过简单的数学找出玩家在 2D 数组中所在的确切图块。这给了我一个流式地图,它在服务器上可能很大,但只有在需要时才将块发送到客户端。

for (j = 0; j < 5; j++) 
{
        for (k = 0; k < 5; k++) 
        {
            a[0][j][k] = 0;
            a[1][j][k] = 1;
            a[2][j][k] = 2;

            a[3][j][k] = 3;
            a[4][j][k] = 4;
            a[5][j][k] = 5;

            a[6][j][k] = 6;
            a[7][j][k] = 7;
            a[8][j][k] = 8;
        }
}

【问题讨论】:

  • 第一个有 9000 个元素,第二个有 810000 个。
  • 任务未完成。尺寸不匹配,所以你应该提供额外的信息
  • 最后的行/列应该相等。将每个 100x100 2D 阵列想象成游戏的平铺地图。现在我想要 9 个这样的瓦片地图。现在将这 9 个平铺地图描绘成 3x3 网格。因此,如果 100x100 的 1 个 2D 数组是地图的一块,那么我想要其中的 9 个。在这些块中,元素 0-2 位于顶部,然后 3-5 位于中间,6-8 位于底部。鉴于该配置,我想将其设为二维数组。所以我错了,我认为它应该是一个 300x300 2D 数组。
  • 如果您使用 C++ 进行编码,请不要提供 100% C 的代码,我的意思是您需要在 C++ 中使用更现代的方法(类型安全)提供所有有用的数据结构方法。您只是使用 C++ 编译器在 C 中编码。

标签: c++ arrays


【解决方案1】:

您可以将任何 n 维数组表示为 m 维数组,只要您有m &lt;= n; m &gt; 0。

任务只是跟踪什么是什么,以及如何到达它。

在您的情况下,可以将array[9][100][100] 转换为二维数组,如下所示:

d1 = 0;
d2 = 0;

a = array[9][100][100];
b = array[2][9 * 100 * 100 / 2];

for (unsigned int i(0); i < 9; i++) {
    for (unsigned int j(0); j < 100; j++) {
        for (unsigned int k(0); k < 100; k++) {
            b[d1][d2] = a[i][j][k];
            d2++;
            d1 = (d2 == 9 * 100 * 100 / 2) ? 1 : 0;
            d2 = (d2 == 9 * 100 * 100 / 2) ? 0 : d2;
        }
    }
}

除此之外的任何东西都需要一个特殊的映射,您需要提供该映射才能说明值 a[i][j][k] 将存储在 b[d1][d2] 中的什么位置。

考虑到你的回答,我想这就是你要找的:

int d1 = 0;
int d2 = 0;

int a[9][100][100];
int b[300][300];

unsigned int i(0), j(0), k(0);
for (i = 0; i < 9; i++) {

    for (j = 0; j < 100; j++) {

        for (k = 0; k < 100; k++) {
            b[d1 + j][d2 + k] = a[i][j][k];
        }

    }

    d1 = (d1 + j == 300) ? 0 : d1 + j;
    d2 = (d2 + k == 300) ? 0 : d2 + k;

}

问候!

【讨论】:

  • 嗯,以 2x9000 结尾似乎不太正确,所以我可能不清楚。决赛中的行/列应该相等。将每个 100x100 2D 阵列想象成游戏的平铺地图。现在我想要 9 个这样的瓦片地图。现在将这 9 个平铺地图描绘成 3x3 网格。因此,如果 100x100 的 1 个 2D 数组是地图的一块,那么我想要其中的 9 个。在这些块中,元素 0-2 位于顶部,然后 3-5 位于中间,6-8 位于底部。如果我真的想要,我可以为此创建 9 个单独的 2D 数组,但我认为将其设为 3D 数组会更容易。
  • 是的,我同意使用 3d 数组更简单,但是,你到底有什么问题?你想拥有什么?你想要array[300][300]吗?
  • 所以要补充一点,我将遍历数组[0][0][n]、数组[1][0][n]和数组[2][ 0][n] 这将全部进入 final_array[0][n] ,其中定义为 final_array[300][300]。
  • 是的,你是对的。我说 [900][900] 是 [300][300] 是错误的。
  • 我已经根据您的回答添加了代码,请检查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2013-08-21
  • 1970-01-01
相关资源
最近更新 更多