Бродяжник!
Ваше сообщение - это то, чего я так долго ждал в этой теме! спасибо огромное!
я с вашей помощи наконец решил эту задачу. Ниже приведен код.
Код
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 Олег_З
если хочешь, можешь включить этот алгоритм в ФАК по матрицам.
только я до сих пор не пойму, почему компиллятор ведет себя именно так, как описал Бродяжник (я понял как ведет, только не понял почему, не логичное поведение какое-то)