Сайт SPYRYTUS_LTD© SPYRYTUS - учеба, работа и развлечения title image
Новости :
    Software News
    Hardware News
Обзоры :
    Главная
    Алгоритмы
    Готовые программы
    Игры
Разработка :
    Свои разработки
    Продажа и заказ ПО
Развлечения :
    Отдохни !

Алгоритм заполнения двумерного массива по спирали

      Наверное у многих было задание на уроках программирования, написать программу которая должна заполнить двумерный массив числами по спирали. Недавно у меня тоже появилась необходимость решить данную задачу. Я ее писал много раз на разных языках программирования - и каждый раз приходилось вспоминать, как я ее писал, но теперь я написал алгоритм, который может заполнить любой массив, любого размера - даже не семетричные.

      Для начала объясню собственно алгоритм. При заполнении двумерного массива по спирали (заполнять будем слева-на-право-сверху-вниз). При заполнении массива улиткой - количество итераций на каждом четвертом проходе будет равно РазмерМассива - 2. Теперь от этих данных и начнем.

      Сперва напишем кусочек кода отвечающий за заполнение только слева-на-право:

if ( y == 0 && x < sizeX - CorrectX && Count <= Summ )
  Mas[y + CorrectY][x + CorrectX] = Count++;		

где y - текущая сторона (0 - вверх, 1 - право, 2 - ...)
sizeX - размер массива по горизонтали
CorrectX - переменная, которая отвечает за автоматическое декриментирование
Count - переменная, которая отвечает за текущую цыфру внутри массива
Summ - произведение ширины на высоту, нужно для устранения ошибки (см. Далее)
Mas - название двумерного массива
x - собственно позиция внутри массива

      Ну, а остальные стороны делаются по вышеописанному принципу, за тем исключением, что меняются местами переменные, а также немного видоизменяется условие. Если Вы заметили, то было написанно, что переменная 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;
  }
}		

      Готовый вариант программы сможете найти, щелкнув в навигационной панели ссылку Готовые программы.

 
  Перейти вверх страници ВВЕРХ Перейти вверх страници
Сайт хостинга Рейтинг посещаемости Поисковая машина Интернет-магазин CD-дисков
Хостинг от uCoz