![]() |
|
#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! ![]() |