Маленькая Ева только учится играть в шахматы. Сегодня она узнала, как слон ходит по шахматной доске. Теперь она хочет понять, куда слон может добраться не более чем за 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");
}
}
}
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");
}
}
}
До любой клетки своего цвета на пустой доске слон доберётся не более чем за два хода. Так что нужно только определить, совпадают ли цвета клеток. Если сумма координат по горизонтали и вертикали чётная, клетка чёрная, если нечётная - белая.
Похожие вопросы
- Почему всеми хваленый фаерфокс хавает память как серый слон?
- Если на DVD-диске маленькая трещина от центра, можно восстановить данные?
- Поставил Ubuntu Linux - доволен как слон =)
- Подскажите программу для школы для интерактивные доски!
- Почему вы осуждаете тех, кто на компе только играет и развлекается?
- Как назыается программа чтоб делать маленькие мультики???
- Установил WINDOWS 7, перестала запускаться игра, Играл в нее год по Виндос ХР, Подскажите что надо сделать
- Добрый день! Из некоторых источников узнал о варианте установки ПО не на системный диск (где стоит ОС)
- Закачала игру файлом iso.потом закачала DAEMON tools.КАК теперь игру установить чтоб играла????ПОДСКАЖИТЕ ПОЖАЛУЙСТА.
- Где у Adobe Flash Player КЭШ? Играет флешрадио, хотелось бы мелодию что играет целиком вытащить.