Двоичные мысли интерпретация

Шахматные задачки. Как ходят шахматные фигуры

Продолжаю решать шахматные задачки на Python. В прошлой задаче нужно было проверять окрашены ли заданные клетки на шахматной доске в один цвет. Теперь будут задачи на ход шахматных фигур и самая простая из них это:

Ход ладьи

Шахматная ладья ходит по горизонтали или вертикали. Даны две различные клетки шахматной доски, определите, может ли ладья попасть с первой клетки на вторую одним ходом. Программа получает на вход четыре числа от 1 до 8 каждое, задающие номер столбца и номер строки сначала для первой клетки, потом для второй клетки. Программа должна вывести YES, если из первой клетки ходом ладьи можно попасть во вторую или NO в противном случае.

Задача очень простая, чтобы решить достаточно представить себе ладью на шахматном поле и проанализировать ее ход. Ладья ходит только либо по вертикале вверх или вниз, либо по горизонтали влево или вправо. Становится ясно, что одна из координат клетки всегда остается неизменной, т.е. если ладья ходит по вертикале неизменна координата Х если по горизонтали то Y. Отсюда напишем условие при котором будем сравнивать если координаты X первой и второй клетки одинаковы или координаты Y первой и второй клетки одинаковы значит выводим YES – ладья может попасть с первой клетки на вторую, иначе – NO, не может.

x1 = int(input())
y1 = int(input())
x2 = int(input())
y2 = int(input())
if x1 == x2 or y1 == y2:
    print('YES')
else:
    print('NO')

Ход короля

Шахматный король ходит по горизонтали, вертикали и диагонали, но только на 1 клетку. Даны две различные клетки шахматной доски, определите, может ли король попасть с первой клетки на вторую одним ходом. Программа получает на вход четыре числа от 1 до 8 каждое, задающие номер столбца и номер строки сначала для первой клетки, потом для второй клетки. Программа должна вывести YES, если из первой клетки ходом короля можно попасть во вторую или NO в противном случае.

Задача посложнее. Проанализируем ход. Король может ходить вверх вниз, вправо влево и по диагонали но только на одну клетку. Т.е. если разность между координатами X и Y будет составлять 1 или -1 (в случае если переходит с меньшей координаты на большую) или разность одной из координат равна 0 то соответственно король может перейти с первой клетки на вторую.

x1 = int(input())
y1 = int(input())
x2 = int(input())
y2 = int(input())

if (x1-x2 == 1 or x1-x2  == -1 or x1-x2  == 0) and (y1-y2 == 1 or y1-y2 == -1 or y1-y2 == 0):
    print ('YES')
else:
    print ('NO')

Что не так с кодом? Все это можно было записать гораздо лаконичнее.

x1 = int(input())
y1 = int(input())
x2 = int(input())
y2 = int(input())

if -1 <= x1-x2 <= 1 and -1 <= y1-y2 <= 1:
    print ('YES')
else:
    print ('NO')

либо использовать функцию абсолютной величины (модуля) числа – abs()

x1 = int(input())
y1 = int(input())
x2 = int(input())
y2 = int(input())

if abs(x1-x2) <= 1 and abs(y1-y2) <= 1:
    print ('YES')
else:
    print ('NO')

Ход слона

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

Проанализируем ход. Двигая слона по шахматной клетки можно заметить, что слон всегда ходит по диагоналям квадрата, т.е. если по координате X он передвинется на 5 клеток то и по координате Y он передвинется на 5 клеток. Отсюда можем сделать вывод, что модуль разности координатов X1 и X2 и Y1 и Y2 всегда будет равен

x1 = int(input())
y1 = int(input())
x2 = int(input())
y2 = int(input())
if abs(x1 - x2) == abs(y1 - y2):
    print('YES')
else:
    print('NO')

Ход ферзя

Шахматный ферзь ходит по диагонали, горизонтали или вертикали. Даны две различные клетки шахматной доски, определите, может ли ферзь попасть с первой клетки на вторую одним ходом.

Проанализируем ход ферзя. Эта фигура ходит как король, но уже на любое доступное количество клеток, ну или можем сказать, что ферзь ходит и как ладья и как слон, мы уже анализировали и писали код для этих фигур поэтому просто объединим два условия в одно:

x1 = int(input())
y1 = int(input())
x2 = int(input())
y2 = int(input())

if abs(x1-x2) <= 1 and abs(y1-y2) <= 1 or x1 == x2 or y1 == y2:
    print ('YES')
else:
    print ('NO')

Ход коня

Шахматный конь ходит буквой “Г” — на две клетки по вертикали в любом направлении и на одну клетку по горизонтали, или наоборот. Даны две различные клетки шахматной доски, определите, может ли конь попасть с первой клетки на вторую одним ходом.

Самая интересная фигура. Проанализировав ход коня буквой "Г" можно увидеть что если конь ходит вниз или вверх буквой то его координата по X меняется на 1 а координата по Y на 2, если влево и вправо то наоборот X на 2 а Y на 1. Исходя из этого можно написать код, что если разность координат X1 и X2 уменьшилась или увеличилась на 1 и при этом разность координат Y1 и Y2 уменьшалась или увеличилась на 2 или если разность координат X1 и X2 уменьшилась или увеличилась на 2 и при этом разность координат Y1 и Y2 уменьшалась или увеличилась на 1 то выводим YES иначе NO

x1 = int(input())
y1 = int(input())
x2 = int(input())
y2 = int(input())

if (x1 - 1 == x2 or x1 + 1 == x2) and (y1 - 2 == y2 or y1 + 2 == y2):
    print ('YES')
elif (x1 - 2 == x2 or x1 + 2 == x2) and (y1 - 1 == y2 or y1 + 1 == y2):
    print ('YES')
else:
    print ('NO')

Очень страшное решение на самом деле, но рабочее. Можно и нужно было применить модуль разницы координат и ввести дополнительные переменные.

x1 = int(input())
y1 = int(input())
x2 = int(input())
y2 = int(input())
dx = abs(x1 - x2) # модуль разницы координат X
dy = abs(y1 - y2) # модуль разницы координат Y
if dx == 1 and dy == 2 or dx == 2 and dy == 1:
# если разность X1 и X2 равна одной клетке а Y1 и Y2 двум или наоборот X1 и Y1
# двум клектам а Y1 и Y2 одной клетке то выводим на экран YES
    print('YES')
else:
    print('NO')

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

Поделитесь, если Вам понравилось!