从单个数组制作二维数组并填充 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。这是 xy 在每次迭代中递增的数字,控制填充的横向运动。

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

  • 如果 xy 超过 4x4(右下角),将 x 减 1,将 y 减 2,然后乘以 direction 通过 -1.
  • 否则,如果xy超过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:

现在尝试使用 numXnumY 的不同值。它们不必是相同的值,只需 > 0。例如:

11x2:

3x7:

10x1:

1x10: