Может ли конь дойти до заданной клетки не более чем за два хода? - 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.

Объяснение кода листинга программы

  1. В начале кода объявляются переменные и массив:
    • tar - массив символов для представления двумерной доски (20x20 ячеек), заполненный символом '0';
    • s - строка, в которую считывается входная информация;
    • x, y, x1, y1 - целочисленные переменные для хранения координат;
    • osh, i, j, m, n, k, x, y, x1, y1, h, v, khod, ii, jj - целочисленные переменные для выполнения различных операций.
  2. В цикле считываются координаты входа и выхода из доски, а также смещение вверх и вправо.
  3. Затем в цикле заполняются значения для соседних ячеек (по горизонтали и вертикали) от начального положения, если смещение в эту сторону не превышает границы доски.
  4. Если соседнее значение равно '1', то в цикле со смещением на 1 ячейку влево и вверх (если не выходит за границу доски) обновляется значение до '2'.
  5. Если значение в ячейке x1,y1 равно '0', то выводится сообщение NO, иначе выводится сообщение YES.
  6. В конце программы считывается символ, чтобы продолжить выполнение других программных средств.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы