Может ли конь дойти до заданной клетки не более чем за два хода? - Free Pascal
Формулировка задачи:
На шахматной доске 8*8 в некоторой клетке гордо стоит конь. Он не простой, а золотой. Этот конь умеет ходить еще и как слон, но только первым ходом.
Ваша задача – по заданным координатам коня определить, сможет ли он дойти до заданной клетки не более чем за два хода.
Входные данные
Координаты коня и заданной клетки
Выходные данные
В единственной строке выведите “YES”, если конь может дойти до заданной клетки не более чем за два хода, и “NO” в противном случае.
Примеры
a1 c2
YES
h1 b4
YES
Я написал свой код, который проверяет можно ли добраться до той точки за 1 ход слона, из которой можно будет побить нужную фигуру. Но она падает на 11 тесте
var
s2,s,s1:string;
x1,x2,y1,y2,k1,k2,k,n,i:integer;
a:array[1..100,1..2]of integer;
b:array[1..100]of integer;
function vaz(y1,y2,x1,x2:integer):boolean;
begin
if ((x1-y1)=(x2-y2))or((x1+y1)=(x2+y2)) then vaz:=true
else vaz:=false;
end;
begin
readln(s);
s1:=s[1]+s[2];
s2:=s[4]+s[5];
if(s1[1]='a')then x1:=1
else if(s1[1]='b')then x1:=2
else if(s1[1]='c')then x1:=3
else if(s1[1]='d')then x1:=4
else if(s1[1]='e')then x1:=5
else if(s1[1]='f')then x1:=6
else if(s1[1]='g')then x1:=7
else if(s1[1]='h')then x1:=8;
val(s1[2],y1,k);
if(s2[1]='a')then x2:=1
else if(s2[1]='b')then x2:=2
else if(s2[1]='c')then x2:=3
else if(s2[1]='d')then x2:=4
else if(s2[1]='e')then x2:=5
else if(s2[1]='f')then x2:=6
else if(s2[1]='g')then x2:=7
else if(s2[1]='h')then x2:=8;
val(s2[2],y2,k);
if(vaz(x1,x2,y1,y2))then begin
writeln('YES');
exit;
end;
if(x2-2>0)then begin
if(y2-1>0)then if(vaz(x1,x2-2,y1,y2-1))then begin
writeln('YES');
exit;
end;
if(y2+1<9)then if(vaz(x1,x2-2,y1,y2+1))then begin
writeln('YES');
exit;
end;
end;
if(x2-1>0)then begin
if(y2-2>0)then if(vaz(x1,x2-1,y1,y2-2))then begin
writeln('YES');
exit;
end;
if(y2+2<9)then if(vaz(x1,x2-1,y1,y2+2))then begin
writeln('YES');
exit;
end;
end;
if(x2+2<9)then begin
if(y2-1>0)then if(vaz(x1,x2+2,y1,y2-1))then begin
writeln('YES');
exit;
end;
if(y2+1<9)then if(vaz(x1,x2+2,y1,y2+1))then begin
writeln('YES');
readln;
exit;
end;
end;
if(x2+1<9)then begin
if(y2-2>0)then if(vaz(x1,x2+1,y1,y2-2))then begin
writeln('YES');
writeln('12345678');
exit;
end;
if(y2+2<9)then if(vaz(x1,x2+1,y1,y2+2))then begin
writeln('YES');
exit;
end;
end;
writeln('NO');
end.Решение задачи: «Может ли конь дойти до заданной клетки не более чем за два хода?»
textual
Листинг программы
type
tar=array[0..10,0..10] of char;
var
a:tar;
s:string;
osh,i,j,m,n,k,x,y,x1,y1,h,v,khod,ii,jj:integer;
begin
readln(s);
x:=ord(s[1])-96;
x1:=ord(s[4])-96;
val(s[2],y,osh);
val(s[5],y1,osh);
for i:=1 to 8 do
for j:=1 to 8 do
a[i,j]:='0';
for i:=1 to 8 do
for j:=1 to 8 do
if(abs(x-i)=abs(y-j)) then a[i,j]:='1';
if(x+2<9)and(y+1<9)then a[x+2,y+1]:='1';
if(x-2>0)and(y+1<9)then a[x-2,y+1]:='1';
if(x+2<9)and(y-1>0)then a[x+2,y-1]:='1';
if(x-2>0)and(y-1>0)then a[x-2,y-1]:='1';
if(x+1<9)and(y+2<9)then a[x+1,y+2]:='1';
if(x-1>0)and(y+2<9)then a[x-1,y+2]:='1';
if(x+1<9)and(y-2>0)then a[x+1,y-2]:='1';
if(x-1>0)and(y-2>0)then a[x-1,y-2]:='1';
for i:=1 to 8 do
for j:=1 to 8 do
if(a[i,j]='1') then begin
if(i+2<9)and(j+1<9)then a[i+2,j+1]:='2';
if(i-2>0)and(j+1<9)then a[i-2,j+1]:='2';
if(i+2<9)and(j-1>0)then a[i+2,j-1]:='2';
if(i-2>0)and(j-1>0)then a[i-2,j-1]:='2';
if(i+1<9)and(j+2<9)then a[i+1,j+2]:='2';
if(i-1>0)and(j+2<9)then a[i-1,j+2]:='2';
if(i+1<9)and(j-2>0)then a[i+1,j-2]:='2';
if(i-1>0)and(j-2>0)then a[i-1,j-2]:='2';
end;
if(a[x1,y1]='0') then writeln('NO')
else writeln('YES');
readln;
end.
Объяснение кода листинга программы
- В начале кода объявляются переменные и массив:
tar- массив символов для представления двумерной доски (20x20 ячеек), заполненный символом '0';s- строка, в которую считывается входная информация;x,y,x1,y1- целочисленные переменные для хранения координат;osh,i,j,m,n,k,x,y,x1,y1,h,v,khod,ii,jj- целочисленные переменные для выполнения различных операций.
- В цикле считываются координаты входа и выхода из доски, а также смещение вверх и вправо.
- Затем в цикле заполняются значения для соседних ячеек (по горизонтали и вертикали) от начального положения, если смещение в эту сторону не превышает границы доски.
- Если соседнее значение равно '1', то в цикле со смещением на 1 ячейку влево и вверх (если не выходит за границу доски) обновляется значение до '2'.
- Если значение в ячейке
x1,y1равно '0', то выводится сообщениеNO, иначе выводится сообщениеYES. - В конце программы считывается символ, чтобы продолжить выполнение других программных средств.