为简单起见,让我们使用 5x5 网格,但您可以将相同的概念应用于其他网格大小。
设置i
为 0。这是一维int values[25]
数组的索引,从第一个值开始。
设置x
为 0 和y
4。这些是二维int grid[5][1]
数组的索引,从左下角开始,控制填充的向前运动。
设置direction
为 1。这是在每次迭代时递增的数字,用于x
控制y
填充的横向运动。
从 0 到 24循环i
。对于每次迭代,复制values[i]
into grid[x][y]
,然后递增x
和y
by direction
,然后检查一些条件:
- 如果
x
并且y
已经超过 4x4(右下角),则减x
1 和y
2 并乘以direction
-1。
- 否则,如果
x
并且y
已经超过 0x0(左上角),则递增x
2 和y
1 并乘以direction
-1。
- 否则,如果
y
已超过 4(底部边缘),则减y
1 并乘以direction
-1。
- 否则,如果
x
已超过 0(左边缘),则递增x
1 并乘以direction
-1。
- 否则,如果
y
已超过 0(顶部边缘),则递增x
2 和y
1 并乘以direction
-1。
- 否则,如果
x
已超过 4(右边缘),则递减x
1 和y
2 并乘以direction
-1。
您最终将到达最后一个角落,您的循环将用完要复制的值。
代码最终看起来像这样(我确信可以通过一些比我想深入研究的更高级的数学来简化它):
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...
结果:

这是 10x10:

numX
现在玩弄和的不同值numY
。它们不必是相同的值,只要 > 0。例如:
11x2:

3x7:

10x1:

1x10:
