0

我有一个 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;
        }
}
4

1 回答 1

1

您可以将任何 n 维数组表示为 m 维数组,只要您有m <= n; m > 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;

}

问候!

于 2012-12-14T00:08:05.180 回答