Часть моего кода:
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
Позволяет работать с сеткой 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
на -1x
а также y
превысили 0x0 (верхний левый угол), приращение x
на 2 и y
на 1 и умножить direction
на -1y
превысил 4 (нижний край), уменьшение y
на 1 и умножить direction
на -1x
превысил 0 (левый край), приращение x
на 1 и умножить direction
на -1y
превысил 0 (верхний край), приращение x
на 2 и y
на 1 и умножить direction
на -1x
превысил 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...
Результат:
Вот 10х10:
Теперь поиграйте с разными значениями numX
а также numY
, Они не должны быть одинаковыми, просто> 0. Например:
11×2:
3×7:
10×1:
1×10: