program China; uses Crt; type Tkrest = array [1..7,1..7] of shortint; {игровое поле} Tstep = record {шаг} x0,y0 :shortint; {начальное положение шашки} x,y :shortint; {конечное положение шашки} end; Tsteps = record {массив шагов} count :shortint; {кол-во шагов} ms :array [1..32] of Tstep; end; const Krest :TKrest=( {начальная позиция} (0,0,2,2,2,0,0), (0,0,2,2,2,0,0), (2,2,2,2,2,2,2), (2,2,2,1,2,2,2), (2,2,2,2,2,2,2), (0,0,2,2,2,0,0), (0,0,2,2,2,0,0) ); var st :Tsteps; function RecStep(K:TKrest):boolean; var i,j :shortint; KS :TKrest; res :boolean; c :shortint; begin res:=false; for i:=1 to 7 do for j:=1 to 7 do if K[i,j]=2 then begin if ((i-2)>0)and(K[i-2,j]=1)and(K[i-1,j]=2) then begin {шаг вниз} KS:=K; KS[i-2,j]:=2; KS[i-1,j]:=1; KS[i,j]:=1; res:=RecStep(KS); if res then begin inc(st.count); st.ms[st.count].X0:=j; st.ms[st.count].Y0:=i; st.ms[st.count].X:=j; st.ms[st.count].Y:=i-2; exit; end; end; if ((i+2)<8)and(K[i+2,j]=1)and(K[i+1,j]=2) then begin {шаг вверх} KS:=K; KS[i+2,j]:=2; KS[i+1,j]:=1; KS[i,j]:=1; res:=RecStep(KS); if res then begin inc(st.count); st.ms[st.count].X0:=j; st.ms[st.count].Y0:=i; st.ms[st.count].X:=j; st.ms[st.count].Y:=i+2; exit; end; end; if ((j-2)>0)and(K[i,j-2]=1)and(K[i,j-1]=2) then begin {шаг влево} KS:=K; KS[i,j-2]:=2; KS[i,j-1]:=1; KS[i,j]:=1; res:=RecStep(KS); if res then begin inc(st.count); st.ms[st.count].X0:=j; st.ms[st.count].Y0:=i; st.ms[st.count].X:=j-2; st.ms[st.count].Y:=i; exit; end; end; if ((j+2)<8)and(K[i,j+2]=1)and(K[i,j+1]=2) then begin {шаг вправо} KS:=K; KS[i,j+2]:=2; KS[i,j+1]:=1; KS[i,j]:=1; res:=RecStep(KS); if res then begin inc(st.count); st.ms[st.count].X0:=j; st.ms[st.count].Y0:=i; st.ms[st.count].X:=j+2; st.ms[st.count].Y:=i; exit; end; end; end; if not res then begin c:=0; for i:=1 to 7 do for j:=1 to 7 do if K[i,j]=2 then inc(c); res:=(c=1); {проверяем конец-ли - осталась одна шашка} end; RecStep:=res; end; procedure ShowKrest(K:TKrest); {рисуем позицию} var i,j :shortint; begin for i:=1 to 7 do begin for j:=1 to 7 do case K[i,j] of 0: write(' '); {не игровое поле} 1: write('·'); {пустое игровое поле} 2: write('o'); {шашка} end; {of case} writeln; end; GotoXY(WhereY-7,1); end; procedure Play(K:TKrest); var i :shortint; KS:TKrest; begin clrscr; KS:=K; ShowKrest(KS); {выводим начальную позицию} readkey; for i:=st.count downto 1 do {прокручиваем игру по шагам} begin KS[st.ms[i].Y0,st.ms[i].X0]:=1; KS[st.ms[i].Y,st.ms[i].X]:=2; KS[st.ms[i].Y0+(st.ms[i].Y-st.ms[i].Y0) div 2,st.ms[i].X0+(st.ms[i].X-st.ms[i].X0) div 2]:=1; ShowKrest(KS); readkey; end; end; var i :shortint; begin {of main program} ClrScr; st.count:=0; if RecStep(Krest) then writeln('Решение найдено!') else begin writeln('Решение не найдено!'); halt; end; for i:=st.count downto 1 do {выводим список ходов} writeln('Step ',(st.count-i+1),' X0=',st.ms[i].X0,' Y0=',st.ms[i].Y0,' X=',st.ms[i].X,' Y=',st.ms[i].Y); readkey; Play(Krest); {проигрывает решение} end.