|
SPYRYTUS - учеба, работа и развлечения | ![]() |
|
Алгоритм заполнения двумерного массива по спирали Наверное у многих было задание на уроках программирования, написать программу которая должна заполнить двумерный массив числами по спирали. Недавно у меня тоже появилась необходимость решить данную задачу. Я ее писал много раз на разных языках программирования - и каждый раз приходилось вспоминать, как я ее писал, но теперь я написал алгоритм, который может заполнить любой массив, любого размера - даже не семетричные. Для начала объясню собственно алгоритм. При заполнении двумерного массива по спирали (заполнять будем слева-на-право-сверху-вниз). При заполнении массива улиткой - количество итераций на каждом четвертом проходе будет равно РазмерМассива - 2. Теперь от этих данных и начнем. Сперва напишем кусочек кода отвечающий за заполнение только слева-на-право: if ( y == 0 && x < sizeX - CorrectX && Count <= Summ ) Mas[y + CorrectY][x + CorrectX] = Count++;
где y - текущая сторона (0 - вверх, 1 - право, 2 - ...) Ну, а остальные стороны делаются по вышеописанному принципу, за тем исключением, что меняются местами переменные, а также немного видоизменяется условие. Если Вы заметили, то было написанно, что переменная Summ, нужна для устранения ошибки - да, так и есть. Ошибка заключается в том, что при последнем цикле первое условии (См. Код) - отрабатывает, а изменить его никак не удавалось, потому пришлось ввести еще одну переменную. Ниже приведен код функции, которая заполняет массив по спирали. Заполнение происходит только в одном направлении - слева-на-право-сверху-вниз. Ну кто захочет - сможет переписать еe таким образом, чтобы она стартовала откуда угодно. Удачи !
void FillHelix( int **Mas, int sizeY, int sizeX )
{
int Summ = sizeX * sizeY;
int CorrectY = 0;
int CorrectX = 0;
int Count = 1;
while( sizeY > 0 )
{
for ( int y = 0; y < 4; y++ )
{
for ( int x = 0; x < ( ( sizeX < sizeY ) ? sizeY : sizeX ); x++ )
{
if ( y == 0 && x < sizeX - CorrectX && Count <= Summ )
Mas[y + CorrectY][x + CorrectX] = Count++;
if ( y == 1 && x < sizeY - CorrectY && x != 0 && Count <= Summ )
Mas[x + CorrectY][sizeX - 1] = Count++;
if ( y == 2 && x < sizeX - CorrectX && x != 0 && Count <= Summ )
Mas[sizeY - 1][sizeX - (x + 1)] = Count++;
if ( y == 3 && x < sizeY - ( CorrectY + 1 ) && x != 0 && Count <= Summ )
Mas[sizeY - (x + 1)][CorrectY] = Count++;
}
}
sizeY--;
sizeX--;
CorrectY += 1;
CorrectX += 1;
}
}
Готовый вариант программы сможете найти, щелкнув в навигационной панели ссылку Готовые программы. |
|||||||||||||||
ВВЕРХ
|
|
© Spyrytus_LTD© 2003 - 2006 гг. |
|