Вам дается 2 шахматных коня.

Ваша задача проста, просто выясните, может ли один конь атаковать другого за один или меньше ходов.

Входные данные В первой строке через пробел записано 2 целых числа x1, y1 - позиция первого коня.

Следующая строка содержит позицию второго коня x2, y2. Где (1 ≤ x1, y1, x2, y2 ≤ 100)

Выходные данные Выведите «Yes», ​​если один из коней может атаковать другого, в противном случае выведите «No».

c++
-4
Islam Kafafy 22 Окт 2019 в 01:09
1
Что вы уже сделали и где застряли?
 – 
goodvibration
22 Окт 2019 в 01:13
1
Люди смогут помочь решить конкретные проблемы с вашим кодом . Загрузите минимальный воспроизводимый пример. stackoverflow.com/help/minimal-reproducible-example
 – 
sweenish
22 Окт 2019 в 01:30

2 ответа

Вот алгоритм.

For all possible destinations for the first knight:
  If the destination is the same position as the second knight:  
      print "Yes"
      End.

Я рекомендую посмотреть шахматные правила хода коня. Не все направления будут находиться в пределах шахматной доски.

Редактировать 1. Таблица ходов коня
Одна из реализаций - иметь таблицу возможных ходов коня:

struct Offset
{
  int x_offset;
  int y_offset;
};

const std::Offset  knight_offsets[] =
{
  {1, 2}, // one over, two down
  {1, -2}, // one over, two up
  //...
};
const unsigned int MAX_KNIGHT_OFFSETS =
  sizeof(knight_offsets) / sizeof(knight_offsets[0]);  

// ...
bool killed = false;
for (unsigned int i = 0; i < MAX_KNIGHT_OFFSETS; ++i)
{
   if ((x1 + knight_offsets[i].x_offset) == x2)  
       && (y1 + knight_offsets[i].y_offset) == y2))
   {
       break;
   }
}
if (i < MAX_KNIGHT_OFFSETS)
{
  std::cout << "Yes\n";
}
else
{
  std::cout << "No\n";
}

Алгоритм добавляет смещение к позиции коня 1, затем проверяет, совпадает ли позиция с позицией коня 2. Если они совпадают, то коня 2 можно убить.
В противном случае проверяется следующий ход.

1
Thomas Matthews 22 Окт 2019 в 01:27

Во-первых, нужно знать, как движется конь в шахматах. Он движется в форме буквы «L» и игнорирует фигуры на своем пути. Такое поведение лучше описать, например, в Википедии - Рыцарь (шахматы)

Следовательно, если конь находится в позиции (x1, y1), он может перемещаться только в следующие 8 клеток:

  • (x1 - 2, y1 - 1)
  • (x1 - 2, y1 + 1)
  • (x1 - 1, y1 - 2)
  • (x1 - 1, y1 + 2)

  • (x1 + 1, y1 - 2)

  • (х1 + 1, у1 + 2)
  • (x1 + 2, y1 - 1)
  • (x1 + 2, y1 + 1)

Пока второй конь находится в одной из этих позиций, его можно съесть за один или меньше ходов.

Кроме того, если мы предполагаем, что ввод (x1, y1, x2, y2) состоит только из допустимых позиций (что обычно бывает в случае проблем Code Force), нам не нужно проверять, действительны ли эти позиции или нет. Это так, потому что мы получим ДА только в том случае, если у нас есть совпадение тестируемой позиции и позиции коня, которая, как мы знаем, действительна.

Следовательно, ваш код должен быть примерно таким:

canEat = false;

FOR: each one of the (x,y) positions listed above)
   IF: x2 == x && y2 == y
      canEat = true;

PRINT: canEat ? "YES" : "NO);
0
Albuquerque 22 Окт 2019 в 01:18