从单个数组生成2d数组并填充StringGrid

时间:2015-05-12 16:20:36

标签: c++ c++builder-6

我的部分代码:

11 19 20 24 25
10 12 18 21 23
4  9  13 17 22
3  5  8  14 16
1  2  6  7  15

任务是制作2维10x10数组并填充StringGrid,如下所示。我找不到合适的算法来做到这一点。有人可以提供一些建议吗?

order

1 个答案:

答案 0 :(得分:0)

为简单起见,让我们使用5x5网格,但您可以将相同的概念应用于其他网格尺寸。

i设置为0.这是1D int values[25]数组的索引,从第一个值开始。

x设置为0,将y设置为4.这些是2D int grid[5][1]数组的索引,从左下角开始,控制填充的向前运动。

direction设置为1.这是xy在每次迭代时递增的数字,控制填充的侧向运动。

循环i从0到24.对于每次迭代,将values[i]复制到grid[x][y],然后将xy增加到direction ,然后检查一些条件:

  • 如果xy已超过4x4(右下角),则将x减1并将y减2并乘以direction -1。
  • 否则,如果xy已超过0x0(左上角),请将x增加2并将y增加1并乘以{{1} by -1。
  • 否则,如果direction超过4(下边缘),则将y减1并将y乘以-1。
  • 否则,如果direction超过0(左边缘),请将x增加1并将x乘以-1。
  • 否则,如果direction已超过0(上边缘),请将y增加2并将x增加1并将y乘以-1。
  • 否则,如果direction超过4(右边缘),则将x减1并将x减2并将y乘以-1。

您最终将到达最后一个角落,您的循环将耗尽要复制的值。

代码最终看起来像这样(我相信可以通过一些比我想深入研究更高级的数学来简化):

direction

结果:

5x5

这是10x10:

10x10

现在使用const int numX = 5; const int numY = 5; const int numValues = numX * numY; int grid[numX][numY]; int values[numValues]; for(int i = 0; i < numValues; ++i) { // for demo purposes... values[i] = i+1;//rand()%1000 } int x = 0; int y = numY-1; int dir = 1; for(int i = 0; i < numValues; ++i) { grid[x][y] = values[i]; x += dir; y += dir; if ((x >= 0) && (x < numX)) { if (y < 0) { x += 2; y += 1; } else if (y >= numY) { y -= 1; } else continue; } else if ((y >= 0) && (y < numY)) { if (x < 0) { x += 1; } else // x >= numX { x -= 1; y -= 2; } } else if ((x >= numX) && (y >= numY)) { x -= 1; y -= 2; } else // (x < 0) && (y < 0) { x += 2; y += 1; } dir = -dir; } // use grid as needed... numX的不同值。它们不必是相同的值,只是&gt; 0.例如:

11x2:
11x2

3X7:
3x7

10×:
10x1

1×10:
1x10