0

我的部分代码:

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
4

1 回答 1

0

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

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

设置x为 0 和y4。这些是二维int grid[5][1]数组的索引,从左下角开始,控制填充的向前运动。

设置direction为 1。这是在每次迭代时递增的数字,用于x控制y填充的横向运动。

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

  • 如果x并且y已经超过 4x4(右下角),则减x1 和y2 并乘以direction-1。
  • 否则,如果x并且y已经超过 0x0(左上角),则递增x2 和y1 并乘以direction-1。
  • 否则,如果y已超过 4(底部边缘),则减y1 并乘以direction-1。
  • 否则,如果x已超过 0(左边缘),则递增x1 并乘以direction-1。
  • 否则,如果y已超过 0(顶部边缘),则递增x2 和y1 并乘以direction-1。
  • 否则,如果x已超过 4(右边缘),则递减x1 和y2 并乘以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...

结果:

5x5

这是 10x10:

10x10

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

11x2:
11x2

3x7:
3x7

10x1:
10x1

1x10:
1x10

于 2015-05-13T05:19:33.097 回答