![]() |
|
|
#1
|
|||
|
|||
|
Задача:
Имеется конь с некоторыми координатами на доске 64Х64 и нуна сделать так, чтобы конь обошел все клетки бобывав в каждой 1 раз. Я знаю, что эта задача известная, но чет ниче хорошего не нашел. Существеут много разных способов, но мне нужен рекурсивный метод, точнее рекурсия с возвратом. Помогите чем можете. |
|
#2
|
||||
|
||||
|
Я так понял тебе нужен алгоритм с возвратом, или как его иначе называют BeckTraking. Подобные задачи хорошо разобраны в книге Вирта "алгоритмы и структуры данных"
Вот тебе пример оттуда на модуле2, этот язык не сильно отличается от паскаля, так что переделать труда не составит Листинг 3.3. Обход поля ходом коня MODULE KnightsTour; FROM InOut IMPORT Readlnt, Done, Writelnt, WriteString, Writeln; VAR i,j,n, Nsqr: INTEGER; q: BOOLEAN; dx.dy: ARRAY [Л..8] OF INTEGER; h: ARRAY [1..8], [1..8] OF INTEGER; PROCEDURE Try(i,x,y: INTEGER; VAR q: BOOLEAN); VAR k, u, y: INTEGER; q1: BOOLEAN; BEGIN k := 0; REPEAT k ;= k+1; q1 := FALSE; u := x + dx[k]; v := у + dy[k]; IF (1 <= u) & (u <=n) & (1 <= v) & (v <=n) & (h[u,v] =0) THEN h[u, v] ;= i IF i < Nsqr THEN Try(i+1,u ,v,q D; IF ~q1 THEN h[u,v] := 0 END ELSE q1 := TRUE END END UNTIL q1 OR (k = : 8); q ;= q1 END Try; BEGIN a[1] := 2; a[2] : = 1; a[3] := -1; a[4] := -2; a[5] := -2; a[6] : — 1 ;a[7] := 1; a[8] ;= 2; b[1] ;= 1; b[2] : = 2; b[3] := 2; b[4] ' — "1 " b[5] := -1; b[6] : = -2; b[7] := -2; b[8] := -1; LOOP Readlnt(n); IF -Done THEN EXIT END; FOR i := 1 TO n DO FOR j :=1 TO n DO h[i,j] := 0 END END; Readlnt(i); Readlnt(j); WriteLn; Nsqr := n*n; h[1,1] := 1; Try(2,i,j,q); IF q THEN FOR i ;= 1 TO n DO FOR j := 1 TO n DO Writelnt(h[i,j], 5) WriteLn END ELSE WriteString ("no path"); WriteLn END END END KnightsTour. Извинете конечно за качество но лучше распознать не получилось. Три раза сканировал, книга старая... могу jpg выложить |