Даны обозначения двух полей шахматной доски (например, A5 и C2). Найти минимальное число ходов, которые нужны шахматному коню для перехода с первого поля на второе — Pascal(Паскаль)

Пример ввода:

A5 C2
Пример вывода:

3

Решение

Ставим коня на поле a8, в ячейку [1,1] квадратной матрицы и вычисляем минимальное количество ходов до каждого поля. Заполняем этими значениями матрицу. По заданным координатам полей определяем позицию второго поля, считая что первое поле [1,1], переносим параллельно поля.

uses crt;
var a:array[1..8,1..8]of byte;
    x1,y1,x2,y2,i,j,k:byte;
    c1,c2:char;
begin
clrscr;
writeln('Поле 1:');
repeat
write('Вертикаль c1=');{символы a-h}
readln(c1);
until c1 in ['a'..'h'];
repeat
write('Горизонталь y1=');{цифры 1-8}
readln(y1);
until y1 in [1..8];
writeln('Поле 2:');
repeat
write('Вертикаль c2=');
readln(c2);
until c2 in ['a'..'h'];
repeat
write('Горизонталь y2=');
readln(y2);
until y2 in [1..8];
x1:=ord(c1)-48;{переводим символы в цифры}
x2:=ord(c2)-48;
for i:=1 to 8 do
for j:=1 to 8 do
a[i,j]:=0;{заполняем матрицу нолями}
a[2,3]:=1;a[3,2]:=1;{первый ход}
k:=0;
repeat
k:=k+1;{следующий ход}
for i:=1 to 8 do
for j:=1 to 8 do
if (a[i,j]=k) then
   begin
     if (i<8)and(j<7)and(a[i+1,j+2]=0) then a[i+1,j+2]:=k+1;{если на этом поле еще не были и оно в пределах доски, ход}
     if (i<8)and(j>2)and(a[i+1,j-2]=0) then a[i+1,j-2]:=k+1;
     if (i>1)and(j<7)and(a[i-1,j+2]=0) then a[i-1,j+2]:=k+1;
     if (i>1)and(j>2)and(a[i-1,j-2]=0) then a[i-1,j-2]:=k+1;
     if (i<7)and(j<8)and(a[i+2,j+1]=0) then a[i+2,j+1]:=k+1;
     if (i<7)and(j>1)and(a[i+2,j-1]=0) then a[i+2,j-1]:=k+1;
     if (i>2)and(j<8)and(a[i-2,j+1]=0) then a[i-2,j+1]:=k+1;
     if (i>2)and(j>1)and(a[i-2,j-1]=0) then a[i-2,j-1]:=k+1;
   end;
until k=6;{максимально 6 ходов}
for i:=1 to 8 do
  begin
   for j:=1 to 8 do
    begin
     textcolor(a[i,j]);{для интереса выведем матрицу ходов}
     write(a[i,j]:3);
    end;
   writeln;
  end;
writeln('k=',a[abs(y1-y2)+1,abs(x1-x2)+1]);{смотрим значение в ячейке, удаленной на заданное количество от ячейки [1,1]}
readln
end.

Если необходимо не возвращаться на исходное поле тогда надо начинать с поля [1,1] и присваивать ему значение=0,

if(x1=x2)and(y1=y2) then writeln('k=0')
else writeln('k=',a[abs(y1-y2)+1,abs(x1-x2)+1]);

Leave a Comment

1 + 5 =