从单个数组制作二维数组并填充 StringGrid
Make 2d array from single array and fill the StringGrid
我的部分代码:
int y[1000];
//Generation of array
void __fastcall TForm1::Button2Click(TObject *Sender){
Memo2->Clear();
for (int i=0;i<100;i++){
y[i]=rand()%1000;
Memo2->Lines->Add(IntToStr(y[i]));
}
}
任务是制作二维 10x10 数组并填充 StringGrid,如下所示。我找不到合适的算法来做到这一点。有人可以提供一些建议吗?
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
为简单起见,让我们使用 5x5 网格,但您可以将相同的概念应用于其他网格尺寸。
将 i
设置为 0。这是一维 int values[25]
数组的索引,从第一个值开始。
将x
设置为0,将y
设置为4。这些是二维int grid[5][1]
数组的索引,从左下角开始,控制填.
将 direction
设置为 1。这是 x
和 y
在每次迭代中递增的数字,控制填充的横向运动。
从 0 到 24 循环 i
。对于每次迭代,将 values[i]
复制到 grid[x][y]
,然后将 x
和 y
递增 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:
我的部分代码:
int y[1000];
//Generation of array
void __fastcall TForm1::Button2Click(TObject *Sender){
Memo2->Clear();
for (int i=0;i<100;i++){
y[i]=rand()%1000;
Memo2->Lines->Add(IntToStr(y[i]));
}
}
任务是制作二维 10x10 数组并填充 StringGrid,如下所示。我找不到合适的算法来做到这一点。有人可以提供一些建议吗?
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
为简单起见,让我们使用 5x5 网格,但您可以将相同的概念应用于其他网格尺寸。
将 i
设置为 0。这是一维 int values[25]
数组的索引,从第一个值开始。
将x
设置为0,将y
设置为4。这些是二维int grid[5][1]
数组的索引,从左下角开始,控制填.
将 direction
设置为 1。这是 x
和 y
在每次迭代中递增的数字,控制填充的横向运动。
从 0 到 24 循环 i
。对于每次迭代,将 values[i]
复制到 grid[x][y]
,然后将 x
和 y
递增 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: