![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() |
Флогримм |
![]() ![]()
Сообщение
#1
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 253 Пол: Мужской Репутация: ![]() ![]() ![]() |
вчера сел решать задачи на тему двумерных массивов - матриц и столкнулся с проблемой; какие можете посоветовать приемы программиования для алгоритмов, вида "заполнить матрицу по спирали, зигзагом" и т.д.
мне не конкретной задачи нужно решение, а метод в целом пришла в голову такая идея: написать процедуры движения по матрице в четырех направленияъ (вверх, вниз, влево, вправо) до тех пор, пока не встретим либо конец матрицы ("крайнюю стенку") или же уже заплненный алгоритм и циклически повторять их до тех пор пока не заполним всю матрицу... да, наверное так и попробую хотя мне кажется, что выход, который предложил выше не совсем правильный; может все можно свести все к основной (единственной формуле) формуле где меняться будет только значение i,j-счетчиков в цикле? вобщем матрицы для меня проблема; помогите чем могите; в книгах же только и делают, что задачки пишут, а концепцию разъясникть - :no: вот так а еще вопрос: 1)как в вин2к в ТП7 установить русскую раскладку клавы; 2)как прервать зациклившийся процесс? (Ctrl-Break и Ctrl-F2 не работают) зосим откланиваюсь, с уважением, Флогримм -------------------- Я не буду жить с этой злобой внутри / Я не буду частью смертельной цепи / Я не буду потребителем твоих идей / Я не буду никогда убивать зверей (Unconform)
|
![]() ![]() |
Флогримм |
![]()
Сообщение
#2
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 253 Пол: Мужской Репутация: ![]() ![]() ![]() |
Бродяжник!
Ваше сообщение - это то, чего я так долго ждал в этой теме! спасибо огромное! я с вашей помощи наконец решил эту задачу. Ниже приведен код. Код program spirall; uses crt; const Size=7; k=-1; {"пустая ячейка" содержит значение k} var mas:array[1..size,1..size]of shortint; i,j,a:integer; function freemas(i,j: shortint): boolean; {(с) Бродяжник - функция проверяет,} begin {является ли ячейка с координатами i,j "пустой ячейкой"} if (i<1) or (i>size) or (j<1) or (j>size) then freemas:=false else freemas:=(mas[i,j]=k); end; procedure draw; {печать массива} begin writeln; for i:=1 to size do begin for j:=1 to size do write(mas[i,j]:2,'|'); writeln; end; end; begin for i:=1 to size do for j:=1 to size do mas[i,j]:=k; {заполнение массива "пустыми ячейками"} clrscr; i:=1; j:=1; mas[i,j]:=1; {algorithm} for a:=1 to sqr(size)-1 do begin if (freemas(i-1,j)) and (not freemas(i,j-1)) then begin dec(i); mas[i,j]:=a+1; end else if freemas(i,j+1) then begin inc(j); mas[i,j]:=a+1; end else if freemas(i+1,j) then begin inc(i); mas[i,j]:=a+1; end else if freemas(i,j-1) then begin dec(j); mas[i,j]:=a+1; end else continue; end; {/algorithm} draw; end. Пришлось чуть-чуть исправить алгоритм, т.е. я установил более высокий приоритет на движение вверх и немного изменил условия этого движ-я (идти вверх, только если верхняя ячейка пуста, а правая заполнена). Можете проверить прога работает. Я считаю, что это один из наиболее универсальных алгоритмов, потому что: 1) количество действий минимальное, для матрицы порядка n оно равно n*n 2) изменяя очередность проверки(приоритет направления) и условия перехода на новую ячейку можно задавать многие виды движений! Например, поменял местами только строки и движ-е уже абсолютно иное, чсмотрите Код if (freemas(i-1,j)) and (not freemas(i,j-1)) then begin dec(i); mas[i,j]:=a+1; end else if freemas(i+1,j) then begin inc(i); mas[i,j]:=a+1; end else if freemas(i,j+1) then begin inc(j); mas[i,j]:=a+1; end else if freemas(i,j-1) then begin dec(j); mas[i,j]:=a+1; end else continue; в данном случае движ-е следующее: Код 01|08|09|16 02|07|10|15 03|06|11|14 04|05|12|13 Не в обиду Вольво будет сказано, но по-моему мой алгоритм более лаконичен и понятен, чем его продвинутые вышеприведенные алгоритмы. 2 Олег_З если хочешь, можешь включить этот алгоритм в ФАК по матрицам. только я до сих пор не пойму, почему компиллятор ведет себя именно так, как описал Бродяжник (я понял как ведет, только не понял почему, не логичное поведение какое-то) -------------------- Я не буду жить с этой злобой внутри / Я не буду частью смертельной цепи / Я не буду потребителем твоих идей / Я не буду никогда убивать зверей (Unconform)
|
![]() ![]() |
![]() |
Текстовая версия | 25.07.2025 22:40 |