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