Показать сообщение отдельно
  #2  
Старый 31.12.2006, 14:20
Аватар для Rom@NS
Rom@NS Rom@NS вне форума
Прохожий
 
Регистрация: 05.11.2006
Адрес: Россия
Сообщения: 18
Репутация: 10
По умолчанию ответ

Я так понял тебе нужен алгоритм с возвратом, или как его иначе называют 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!
Ответить с цитированием