Проверка: может ли шашка "съесть" шашку противника? Реализация на Python

Задача:

В первой строке даны числа N и M (1 ≤ N, M ≤ 103) - размеры доски, на которой разработчики играют в шашки. Каждое поле имеет свой цвет, черный или белый. При этом гарантируется, что поле с координатами (1, 1) имеет черный цвет. Гарантируется также, что поле, имеющее общую границу с черным полем, будет иметь белый цвет, а поле, имеющее общую границу с белым полем, - черный цвет.

В следующей строке дано число w - количество белых шашек на поле. В следующих w строках задаются два целых числа i и j (1 ≤ i ≤ N, 1 ≤ j ≤ M) - поля, на которых стоят белые шашки. В следующей строке дано число b - количество черных шашек на поле. В следующих b строках задаются поля с черными шашками, точно так же, как и с белыми. Гарантируется, что количество шашек каждого цвета - целое положительное число, и что 2 ≤ w + b ≤ (NM + 1) / 2 .Гарантируется, что все шашки стоят на черных полях.

В заключительной строке ввода указано, чей ход: white, если белых, и black, если черных.

Задача выглядит несложной, начал решать в лоб - написал условие. Оказалось, что не все тесты проходят. Не могу найти вариант расстановки, при котором алгоритм ошибается.

Мой код:

N, M = map(int, input().split())
w = int(input())
w_coord = [list(map(int, input().split())) for i in range(w)]
b = int(input())
b_coord = [list(map(int, input().split())) for i in range(b)]
move = input()

def moving(arr1, arr2, N, M):
    for i in range(len(arr1)):
        if (((([arr1[i][0] + 1, arr1[i][1] + 1] in arr2) and
                ([arr1[i][0] + 2, arr1[i][1] + 2] not in arr2) and
                 ([arr1[i][0] + 2, arr1[i][1] + 2] not in arr1) and
                ((arr1[i][0] + 2 <= N) and (arr1[i][1] +2 <= M))) or

            (([arr1[i][0] - 1, arr1[i][1] + 1] in arr2) and
                ([arr1[i][0] - 2, arr1[i][1] + 2] not in arr2) and
                 ([arr1[i][0] - 2, arr1[i][1] + 2] not in arr1 ) and
                ((arr1[i][0] - 2 <= N) and (arr1[i][1] + 2 <= M)))) or

            (((([arr1[i][0] - 1, arr1[i][1] - 1] in arr2) and
                ([arr1[i][0] - 2, arr1[i][1] - 2] not in arr2) and
                 ([arr1[i][0] - 2, arr1[i][1] - 2] not in arr1) and
                ((arr1[i][0] - 2 <= N) and (arr1[i][1] - 2 <= M))) or

            (([arr1[i][0] + 1, arr1[i][1] - 1] in arr2) and
                ([arr1[i][0] + 2, arr1[i][1] - 2] not in arr2) and
                 ([arr1[i][0] + 2, arr1[i][1] - 2] not in arr1) and
                ((arr1[i][0] + 2 <= N) and (arr1[i][1] - 2 <= M)))))):
            return 'Yes'
    return 'No'

if move == 'white':
    print(moving(w_coord, b_coord, N, M))
else:
    print(moving(b_coord, w_coord, N, M))

Ответы (1 шт):

Автор решения: MBo

При ходе влево и вниз нужно сравнивать с нулём, а не с N, M

((arr1[i][0] - 2 > 0)

и т.п.

→ Ссылка