Xpoint
   [напомнить пароль]

Заполнение матрицы по спирали с заданным интервалом между элементами

Метки: [без меток]
2012-08-02 12:16:16 [обр] doniy_serhey[досье]
сообщение промодерировано

Здравствуйте, дорогие форумчане!!!
Делаю программу одному другу - он занимается игрой в государственные лотереи и попросил составить ему программу следующего содержания:

Дана последовательность 80 чисел (как она рассчитывается, думаю, можно упустить)...
Далее с этой последовательностью делаем следующее:

  1. Он сам выбирает расстояние между элементами и матрица 9х9 заполняется с заданным интервалом (причем ячейка с индексом [9,9] (если нумерация элементов начать не с 0 как в С-подобных языках, а c 1),

например, если интервал=0, то матрица заполняется по обычной спирали (с этим проблем нет - еще в школе его разобрал), но если интервал > 1, то возникают проблемы... Вот как это выглядит при интервале 1 (покажу на матрице 5х5):

192103
8161711
15204
7191812
146135free

На этом 1 этап прохода заканчивается, как видно - пустую клетку вообще не учитываем и при вычислении следующего номера ячейки ее упускаем, как будто и нет ее. На следующем этапе ищем самую первую свободную ячейку (сверху вниз, слева - направо) - с этим проблем у меня не возникнет и заполняем оставшиеся пустые клетки.

192103
816211711
152420224
719231812
146135free

Вот как это объяснить компилятору????
Можете предложить способы решения данной проблемы, а, в частности, я предлагаю свое видение решения (на самом деле это не код программы отдельно взятого языка, просто я пишу на С-подобных языках, поэтому буду придерживаться такого синтаксиса):

i = 1 // Порядковый номер элемента исходного массива
index = {0,0}; // Массив с координатами следующей ячейки, получаемой из функции
ind_i = 0; // Номер текущей строки элемента
ind_j = 0; // Номер текущего столбца элемента
dx = 1 // Шаг
while (i <= 80)
{
    if (i == 0)
    {
         arr_res[ind_j, ind_i] = arr_src[i];
         i++;
    }
    else
    {
         index = GetNextFreeCell(ind_j, ind_i, dx)
         ind_i = index[0];
         ind_j = index[1];
         arr_res[ind_j][ind_i] = arr_src[i];
         i++;
    }
}

Но вот как реализовать функцию получения индекса следующей ячейки, в которую нужно вставить следующий элемент.... Вот этого я не знаю.... Может, кто-то может предложить способ решения проблемы????

спустя 1 час 46 минут [обр] Lynn «Кофеман»(0/571)[досье]
Я не понял почему у вас число 20 попало в середину квадрата, а не между 16 и 17?
спустя 1 час 47 минут [обр] doniy_serhey[досье]
потому что интервал 1 клетка между клетками и когда он проход доходит до 8, то он ищет ближайшую пустую ячейку следующим образом:
  1. Вверх (если закончились элементы) ->> переход влево, и, если пустая ячейка, то заполняет ее.
  2. Если первый этап вернул ЛОЖЬ, то идем вправо.
  3. Если и второй этап вернул ЛОЖЬ, то ищем самую первую пустую ячейку и заполняем по спирали заново!
спустя 1 минуту [обр] doniy_serhey[досье]
простите за оперативность, у меня модем 2G и слабый сигнал((((
поэтому сигнал есть не всегда(((
спустя 2 минуты [обр] Lynn «Кофеман»(0/571)[досье]
При чём тут 8? Я про 20 спрашивал.
спустя 1 час 29 минут [обр] doniy_serhey[досье]

Я, кажется, понял, в чем вы заблуждаетесь... 20 в центре потому что это ближайшая свободная ячейка с интервалом 1 клетка от 19, т.е. от 19 есть 2 варианта заполнения:
19 находится в позиции [2,4] (я нумерацию индексов начинаю с 1, 2 - столбец, 4 - строка (дальше по аналогии будут приводиться индексы))

  1. Становится в позицию [2, 2] - Но эта ячейка уже занята цифрой 16
  2. Становится в позицию [3, 3] - Свободная центральная ячейка

При расчете расстояния от текущего элемента до нового не учитывается расстояние по диагонали!!!

спустя 7 минут [обр] doniy_serhey[досье]
Ой, я неправильно написал движение поиска первой свободной ячейки: слева-направо движение, простите, то было в перспективе!!! Поэтому на 2 проходе первая свободная ячейка оказалась с индексом [2, 2]
спустя 17 часов [обр] Евгений Седов aka KPbIC(0/176)[досье]
С вашими поправками "Ой, я неправильно написал..." я так логики обхода и не понял. И тот код, который вы представили, говорит о том, что к решению задачи по существу вы даже не приступали.
спустя 3 дня [обр] doniy_serhey[досье]
Все проблема решена!
Тему можно закрывать!!!
спустя 5 минут [обр] Евгений Седов aka KPbIC(0/176)[досье]
Поделиться решением не хотите?
Powered by POEM™ Engine Copyright © 2002-2005