Создайте 2d массив из одного массива и заполните 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]));
}
}

Задача состоит в том, чтобы сделать 2-мерный массив 10х10 и заполнить 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

0

Решение

Позволяет работать с сеткой 5×5 для простоты, но вы можете применить те же концепции к другим размерам сетки.

Задавать 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 превысили 4×4 (нижний правый угол), уменьшение 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...

Результат:

5x5

Вот 10х10:

10х10

Теперь поиграйте с разными значениями numX а также numY, Они не должны быть одинаковыми, просто> 0. Например:

11×2:
11x2

3×7:
3x7

10×1:
10x1

1×10:
1x10

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector