Решение задачи №1088 «Шахматные фигуры» с ACMP





Решение задачи №1088 «Шахматные фигуры» с ACMP

Условие задачи

По заданным координатам двух клеток шахматной доски необходимо определить список шахматных фигур, которые могут перемещаться при игре за «белых» по правилам шахмат из первой координаты во вторую без взятия фигуры соперника.

Напомним, что для игры в шахматы используется доска размером 8х8. При этом горизонтальная координата нумеруется английскими буквами от «A» до «H», а вертикальная – цифрами от 1 до 8 снизу вверх. Таким образом, координата клетки состоит из буквы и цифры. Например, «H1» и «A8» – правый нижний и левый верхний углы соответственно.

Всего существует 6 шахматных фигур: ладья, слон, конь, ферзь, король и пешка. Опишем правила выполнения хода без взятия на свободной доске:

король ходит на расстояние 1 по вертикали, горизонтали или диагонали;
ферзь ходит на любое расстояние по вертикали, горизонтали или диагонали;
ладья ходит на любое расстояние по вертикали или горизонтали;
слон ходит на любое расстояние по диагонали;
конь ходит буквой «Г», т.е. на поле, находящееся на расстоянии 2 по вертикали и 1 по горизонтали или 1 по вертикали и 2 по горизонтали;
пешка ходит на 1 поле вперед по вертикали, начиная свое движение со второй линии, при первом ходе пешка может перемещаться на 2 поля вперед по вертикали.
Следующие рисунки отражают возможные перемещения шахматных фигур (в скобках указаны англоязычные названия фигур):


Шахматная доска Ладья (Rook) Слон (Bishop)

Конь (Knight) Ферзь (Queen) Король (King) Пешка (Pawn)
Входные данные
В первой строке входного файла INPUT.TXT через пробел записаны начальная и конечная координаты шахматной доски. Каждая координата состоит из заглавной английской буквы от «A» до «H» и цифры от 1 до 8. Гарантируется, что начальная и конечная координаты не совпадают.

Выходные данные
В выходной файл OUTPUT.TXT выведите по-английски названия шахматных фигур, которые могут совершить свободный ход из первой координаты во вторую по правилам шахмат. Если ни одна из фигур не может выполнить такой ход, то следует вывести «Nobody». Фигуры следует выводить без повторов в произвольном порядке.

#include <iostream>
#include <cmath>
using namespace std;
main() {
int b1,t1,t2,b2,m,n,k=0;
char a1,a2;
scanf("%c%d /n",&a1,&b1);
t1=a1;
scanf("%c%d",&a2,&b2);
t2=a2;
if ((t1==t2)||(b1==b2)) { cout<<"Rook"<<endl; k=1; }
n=t1-t2; if (n<0) n=n*(-1);
m=b1-b2; if (m<0) m=m*(-1);
if (n==m) { cout<<"Bishop"<<endl; k=1; }
if (((t2==t1+1) && (b2==b1+2)) || ((t2==t1+2) && (b2==b1+1)) || ((t2==t1-1) && (b2==b1+2)) || ((t2==t1-2) && (b2==b1+1)) ||
((t2==t1-1) && (b2==b1-2)) || ((t2==t1-2) && (b2==b1-1)) || ((t2==t1+1) && (b2==b1-2)) || ((t2==t1+2) && (b2==b1-1)))
{ cout<<"Knight"<<endl; k=1; }
if (((t1==t2)||(b1==b2))||(n==m))
{ cout<<"Queen"<<endl; k=1; }
if (((t2==t1+1)&&(b1==b2)) || ((t2==t1-1)&&(b1==b2)) || ((b2==b1+1)&&(t1==t2)) || ((b2==b1-1)&&(t1==t2)) || ((t2==t1+1)&&(b2==b1+1)||
((t2==t1-1)&&(b2==b1+1))||((t2==t1-1)&&(b2==b1-1))||((t2==t1+1)&&(b2==b1-1))))
{ cout<<"King"<<endl; k=1; }
if (t1==t2&&b1!=1)
if (b1==2&&b1+2==b2||b1+1==b2)
{ cout<<"Pawn"<<endl; k=1; }
if (k==0) cout<<"Nobody";
}



Условия задач взяты с сайта acmp.ru