Необходимо проверить может ли пара ферзей напасть друг на друга
Сначала мы с клавиатуры вводим число пар координат, потом вводим сами координаты и по этим координатам выставляем ферзей на шахматной доске. Задача в том, что если ферзь может бить другую, то возвращаем "YES", если нет "NO. У меня проблема с тем, что не получается проверка на "атаку" по диагонали. Нужна помощь или совет!
Вот мой ход мыслей (без инпутов):
arr = [
[0, 0 ,0 ,0, 0, 0, 0, 0],
[0, 0 ,0 ,0, 0, 0, 0, 0],
[0, 0 ,0 ,0, 0, 0, 0, 0],
[0, 0 ,0 ,0, 0, 0, 0, 0],
[0, 0 ,0 ,0, 0, 0, 0, 0],
[0, 0 ,0 ,0, 0, 0, 0, 0],
[0, 0 ,0 ,0, 0, 0, 0, 0],
[0, 0 ,0 ,0, 0, 0, 0, 0]
]
# for good vision
def show_arr(arr):
for row in arr:
print(''.join([f'{el:^4}' for el in row]))
# placing our Queens by coordinates
def get_figure(arr, coords_list):
for cord in coords_list:
for ir, row in enumerate(range(8), start=1):
for ic, col in enumerate(range(8), start=1):
if ir == cord[0] and ic == cord[1]:
arr[row][col] = 'Q'
return arr
def check(arr):
s = 1
for row in range(8):
for col in range(8):
if arr[row][col] == 'Q':
if arr[row-s][col+s] == 'Q':
return 'YES'
elif arr[row-s][col-s] == 'Q':
return 'YES'
elif arr[row+s][col-s] == 'Q':
return 'YES'
elif arr[row+s][col+s] == 'Q':
return 'YES'
s += 1
print(s)
return 'NO'
if __name__ == '__main__':
coords_list = [[1, 1], [3, 5], [7, 7]]
show_arr(get_figure(arr, coords_list))
print(check(get_figure(arr, coords_list)))
Ответы (1 шт):
Достаточно проверить условие:
x1 - y1 == x2 - y2 or x1 + y1 == x2 + y2 or x1 == x2 or y1 == y2
Его несложно получить, если построить таблицу арифметических операций над координатами:
Источник фото: stepik
Для клеток, лежащих на диагоналях матрицы параллельных главной, разности координат равны. А для клеток, лежащих на диагоналях матрицы параллельных вспомогательной, суммы координат равны.