Программное обеспечение

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

Маленькая Ева только учится играть в шахматы. Сегодня она узнала, как слон ходит по шахматной доске. Теперь она хочет понять, куда слон может добраться не более чем за 100 ходов. Помогите Еве понять, может ли слон добраться от одной клетки до другой клетки шахматной доски.

Шахматный слон за один ход перемещается по диагонали на любое количество клеток. Шахматная доска имеет размеры 8 × 8.

Входные данные
Программа получает на вход 4 числа, записанных в отдельных строках. Первые два числа — номер строки и номер столбца исходной клетки, следующие два числа — номер строки и номер столбца конечной клетки (каждое число принимает значения от 1 до 8). Гарантируется, что исходная и конечная клетки не совпадают.

Выходные данные
В первой строке выведите Yes или No — ответ на вопрос задачи. Если в первой строке вы вывели Yes, то во второй строке выведите число n — количество ходов слона (число не превосходящее 100). В следующих n строках выведите последовательно клетки (номер строки и номер столбца клетки через пробел), в которые нужно перемещать слона. Последняя выведенная клетка должна совпадать с заданной конечной клеткой.

Вам не нужно минимизировать число ходов слона, но оно не должно превосходить 100.
//C# 7.3
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleTestApp
{
class Program
{
static void Main()
{
(byte X, byte Y) start = (byte.Parse(Console.ReadLine()), byte.Parse(Console.ReadLine()));
(byte X, byte Y) finish = (byte.Parse(Console.ReadLine()), byte.Parse(Console.ReadLine()));

if ((start.X + start.Y) % 2 == (finish.X + finish.Y) % 2)
{
Console.WriteLine("Yes");

var visited = new HashSet<(byte X, byte Y)>();
var queue = new Queue<List<(byte X, byte Y)>>(new[] { new List<(byte X, byte Y)> { start } });
while (queue.Count > 0)
{
var currentPath = queue.Dequeue();
var currentCell = currentPath.Last();
if (currentCell == finish)
{
Console.WriteLine(currentPath.Count - 1);
foreach (var (X, Y) in currentPath.Skip(1))
Console.WriteLine($"{X} {Y}");
break;
}
else
{
visited.Add(currentCell);
if (currentPath.Count < 100)
{
var neighbors = new List<(byte X, byte Y)>();
if (currentCell.X < 8 && currentCell.Y < 8)
neighbors.Add(((byte X, byte Y))(currentCell.X + 1, currentCell.Y + 1));
if (currentCell.X < 8 && currentCell.Y > 1)
neighbors.Add(((byte X, byte Y))(currentCell.X + 1, currentCell.Y - 1));
if (currentCell.X > 1 && currentCell.Y < 8)
neighbors.Add(((byte X, byte Y))(currentCell.X - 1, currentCell.Y + 1));
if (currentCell.X > 1 && currentCell.Y > 1)
neighbors.Add(((byte X, byte Y))(currentCell.X - 1, currentCell.Y - 1));
foreach (var neighbor in neighbors)
if (!visited.Contains(neighbor))
{
var newPath = currentPath.ToList();
newPath.Add(neighbor);
queue.Enqueue(newPath);
}
}
}
}

}
else
Console.WriteLine("No");
}
}
}
Temirlan Alin
Temirlan Alin
1 105
Лучший ответ
До любой клетки своего цвета на пустой доске слон доберётся не более чем за два хода. Так что нужно только определить, совпадают ли цвета клеток. Если сумма координат по горизонтали и вертикали чётная, клетка чёрная, если нечётная - белая.