![]() |
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 гг. |
![]() ![]() |