Может ли конь дойти до заданной клетки не более чем за два хода? - 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
. - В конце программы считывается символ, чтобы продолжить выполнение других программных средств.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д