我的部分代码:
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
答案 0 :(得分:0)
为简单起见,让我们使用5x5网格,但您可以将相同的概念应用于其他网格尺寸。
将i
设置为0.这是1D int values[25]
数组的索引,从第一个值开始。
将x
设置为0,将y
设置为4.这些是2D int grid[5][1]
数组的索引,从左下角开始,控制填充的向前运动。
将direction
设置为1.这是x
和y
在每次迭代时递增的数字,控制填充的侧向运动。
循环i
从0到24.对于每次迭代,将values[i]
复制到grid[x][y]
,然后将x
和y
增加到direction
,然后检查一些条件:
x
和y
已超过4x4(右下角),则将x
减1并将y
减2并乘以direction
-1。x
和y
已超过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
结果:
这是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:
3X7:
10×:
1×10: