|
#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 выложить VSU, AMM, Software and administration of information systems We are the best among the best! |