![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Dima3D |
![]()
Сообщение
#1
|
Школьник ![]() Группа: Продвинутые Сообщений: 11 Регистрация: 7.4.2009 Город: Челябинск ![]() |
Задача - обход конём шахматной доски
Две просьбы помощи, первая - выводить на экран обхода нет, если в массиве есть одинаковые элементы и второе - не хочет правильно выводить массив, если размерность не квадратная Алгоритм: program Project4; {$APPTYPE CONSOLE} const size=100; type mas=array [1..size,1..size] of integer; Horse=array [1..8] of integer; var brd,brd2:mas; i,j,k,l:integer; xn,yn,x0,y0,x1,y1,min,m,n:integer; a,b,T:Horse; res:integer; procedure step(var a,b:Horse); {Возможный шаг} begin a[1]:=1; b[1]:=2; a[2]:=2; b[2]:=1; a[3]:=-1; b[3]:=2; a[4]:=2; b[4]:=-1; a[5]:=-2; b[5]:=1; a[6]:=1; b[6]:=-2; a[7]:=-1; b[7]:=-2; a[8]:=-2; b[8]:=-1; end; function CountStep(xn,yn:integer):integer; {Количество шагов} var i :integer; begin result:=0; for i:=1 to 8 do begin if (((xn+a[i]) in [1..m])and((yn+b[i])in [1..n])and(brd[(xn+a[i]),(yn+b[i])]=0)) then begin result:=result+1; end; end; end; { Проверка возможности обхода } function isPossible:boolean; begin Result:=(((M*N) mod 2)=0) or (((x0+y0) mod 2)=0) and (x0>0) and (y0>0) and (x0<=m) and (y0<=n); end; procedure knght(x0,y0,m,n:integer;stp:integer; var brd:mas); var i,j:integer; begin if stp=m*n-1 then begin //writeln(x0,y0,stp); if brd[x0,y0]=0 then brd[x0,y0]:=stp; //brd[x0,y0]:=stp; end else begin for i:=1 to 8 do begin T[i]:=0; end; if stp<m*n then begin if brd[x0,y0]=0 then begin brd[x0,y0]:=stp; end; for i:=1 to 8 do begin xn:=x0+a[i]; yn:=y0+b[i]; if (xn in [1..m])and(yn in [1..n])and(brd[xn,yn]=0) then begin T[i]:=CountStep(xn,yn); end; end; min:=1; for i:=2 to 8 do begin if ((T[min]>T[i])and(T[i]<>0))or((T[min]=0)and(T[i]<>0)) then begin min:=i; end; end; x1:=x0+a[min]; y1:=y0+b[min]; knght(x1,y1,m,n,stp+1,brd); end end; end; begin res:=0; step(a,(IMG:style_emoticons/default/cool.gif); write('m=');readln(m); write('n=');readln(n); write('x0=');readln(x0); write('y0=');readln(y0); if IsPossible then begin knght(x0,y0,m,n,1,brd); for k:=1 to m do begin for l:=1 to n do begin while brd[k,l]=0 do brd[k,l]:=m*n; if brd[k,l] div 10>=10 then begin write(brd[k,l],' '); end else if (brd[k,l] div 10) in [1..9] then begin write(brd[k,l],' '); end else if(brd[k,l] div 10)=0 then begin write(brd[k,l],' '); end; if l=m then begin writeln; writeln; end; end; end; end else writeln ('obxoda net'); readln; end. |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 28.5.2025, 9:54 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru