Может ли конь дойти до заданной клетки не более чем за два хода? - Free Pascal

Узнай цену своей работы

Формулировка задачи:

На шахматной доске 8*8 в некоторой клетке гордо стоит конь. Он не простой, а золотой. Этот конь умеет ходить еще и как слон, но только первым ходом. Ваша задача – по заданным координатам коня определить, сможет ли он дойти до заданной клетки не более чем за два хода. Входные данные Координаты коня и заданной клетки Выходные данные В единственной строке выведите “YES”, если конь может дойти до заданной клетки не более чем за два хода, и “NO” в противном случае. Примеры a1 c2 YES h1 b4 YES Я написал свой код, который проверяет можно ли добраться до той точки за 1 ход слона, из которой можно будет побить нужную фигуру. Но она падает на 11 тесте
Листинг программы
  1. var
  2. s2,s,s1:string;
  3. x1,x2,y1,y2,k1,k2,k,n,i:integer;
  4. a:array[1..100,1..2]of integer;
  5. b:array[1..100]of integer;
  6. function vaz(y1,y2,x1,x2:integer):boolean;
  7. begin
  8. if ((x1-y1)=(x2-y2))or((x1+y1)=(x2+y2)) then vaz:=true
  9. else vaz:=false;
  10. end;
  11. begin
  12. readln(s);
  13. s1:=s[1]+s[2];
  14. s2:=s[4]+s[5];
  15. if(s1[1]='a')then x1:=1
  16. else if(s1[1]='b')then x1:=2
  17. else if(s1[1]='c')then x1:=3
  18. else if(s1[1]='d')then x1:=4
  19. else if(s1[1]='e')then x1:=5
  20. else if(s1[1]='f')then x1:=6
  21. else if(s1[1]='g')then x1:=7
  22. else if(s1[1]='h')then x1:=8;
  23. val(s1[2],y1,k);
  24. if(s2[1]='a')then x2:=1
  25. else if(s2[1]='b')then x2:=2
  26. else if(s2[1]='c')then x2:=3
  27. else if(s2[1]='d')then x2:=4
  28. else if(s2[1]='e')then x2:=5
  29. else if(s2[1]='f')then x2:=6
  30. else if(s2[1]='g')then x2:=7
  31. else if(s2[1]='h')then x2:=8;
  32. val(s2[2],y2,k);
  33. if(vaz(x1,x2,y1,y2))then begin
  34. writeln('YES');
  35. exit;
  36. end;
  37. if(x2-2>0)then begin
  38. if(y2-1>0)then if(vaz(x1,x2-2,y1,y2-1))then begin
  39. writeln('YES');
  40. exit;
  41. end;
  42. if(y2+1<9)then if(vaz(x1,x2-2,y1,y2+1))then begin
  43. writeln('YES');
  44. exit;
  45. end;
  46. end;
  47. if(x2-1>0)then begin
  48. if(y2-2>0)then if(vaz(x1,x2-1,y1,y2-2))then begin
  49. writeln('YES');
  50. exit;
  51. end;
  52. if(y2+2<9)then if(vaz(x1,x2-1,y1,y2+2))then begin
  53. writeln('YES');
  54. exit;
  55. end;
  56. end;
  57. if(x2+2<9)then begin
  58. if(y2-1>0)then if(vaz(x1,x2+2,y1,y2-1))then begin
  59. writeln('YES');
  60. exit;
  61. end;
  62. if(y2+1<9)then if(vaz(x1,x2+2,y1,y2+1))then begin
  63. writeln('YES');
  64. readln;
  65. exit;
  66. end;
  67. end;
  68. if(x2+1<9)then begin
  69. if(y2-2>0)then if(vaz(x1,x2+1,y1,y2-2))then begin
  70. writeln('YES');
  71. writeln('12345678');
  72. exit;
  73. end;
  74. if(y2+2<9)then if(vaz(x1,x2+1,y1,y2+2))then begin
  75. writeln('YES');
  76. exit;
  77. end;
  78. end;
  79. writeln('NO');
  80. end.

Решение задачи: «Может ли конь дойти до заданной клетки не более чем за два хода?»

textual
Листинг программы
  1. type
  2.     tar=array[0..10,0..10] of char;
  3.  
  4. var
  5.     a:tar;
  6.     s:string;
  7.     osh,i,j,m,n,k,x,y,x1,y1,h,v,khod,ii,jj:integer;
  8.  
  9.  
  10. begin
  11. readln(s);
  12.    
  13. x:=ord(s[1])-96;
  14.  
  15.  
  16. x1:=ord(s[4])-96;
  17. val(s[2],y,osh);
  18. val(s[5],y1,osh);
  19.  
  20.  
  21. for i:=1 to 8 do
  22.  for j:=1 to 8 do
  23.   a[i,j]:='0';
  24.  
  25. for i:=1 to 8 do
  26.  for j:=1 to 8 do
  27.   if(abs(x-i)=abs(y-j)) then a[i,j]:='1';
  28.  
  29. if(x+2<9)and(y+1<9)then a[x+2,y+1]:='1';
  30. if(x-2>0)and(y+1<9)then a[x-2,y+1]:='1';
  31. if(x+2<9)and(y-1>0)then a[x+2,y-1]:='1';
  32. if(x-2>0)and(y-1>0)then a[x-2,y-1]:='1';
  33. if(x+1<9)and(y+2<9)then a[x+1,y+2]:='1';
  34. if(x-1>0)and(y+2<9)then a[x-1,y+2]:='1';
  35. if(x+1<9)and(y-2>0)then a[x+1,y-2]:='1';
  36. if(x-1>0)and(y-2>0)then a[x-1,y-2]:='1';
  37.  
  38.    for i:=1 to 8 do
  39.     for j:=1 to 8 do
  40.      if(a[i,j]='1') then begin
  41.         if(i+2<9)and(j+1<9)then a[i+2,j+1]:='2';
  42.         if(i-2>0)and(j+1<9)then a[i-2,j+1]:='2';
  43.         if(i+2<9)and(j-1>0)then a[i+2,j-1]:='2';
  44.         if(i-2>0)and(j-1>0)then a[i-2,j-1]:='2';
  45.         if(i+1<9)and(j+2<9)then a[i+1,j+2]:='2';
  46.         if(i-1>0)and(j+2<9)then a[i-1,j+2]:='2';
  47.         if(i+1<9)and(j-2>0)then a[i+1,j-2]:='2';
  48.         if(i-1>0)and(j-2>0)then a[i-1,j-2]:='2';
  49.     end;
  50.  
  51.    if(a[x1,y1]='0') then writeln('NO')
  52.       else writeln('YES');
  53.    readln;
  54. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы