Непонятная ошибка в проверке хода конеслона

Некоторые из вас могут играть в шахматы, но мы совершенно точно убеждены, что вы еще не слышали про новую фигуру в них! Правда, ее введение находится на этапе согласования... но Комитет по Стандартизации Шахмат уже имеет полное видение ее игровой механики. Новая фигура будет называться «Кочевник» и ее ход состоит из комбинации ходов двух уже обыденных фигур. Сначала Кочевник ходит как Конь, а потом — как Слон, и все это обязательно выполняется в рамках одного хода. Вам предоставлен доступ к тестовой шахматной доске, чтобы вы могли опробовать новую фигуру. Формат входных данных В единственной строке входного файла вводятся четыре натуральных числа x1, y1, x2, y2 (1 6 x1, y1, x2, y2 6 8). (x1, y1) — ряд и столбец поля, в котором стоит Кочевник. (x2, y2) — ряд и столбец поля, которое нужно проверить, можно ли в него попасть за один ход. Ряды доски нумеруются сверху вниз, столбцы — слева направо. Формат выходных данных В единственной строке выходного файла выведите «YES» (без кавычек), если Кочевник может попасть за один ход из (x1, y1) в (x2, y2). В ином случае выведите «NO» (без кавычек).

x1, y1, x2, y2 = map(int, input().split())

if x1==x2 and y1==y2:
    print("YES")
    exit()
for i in range(4):
    x11 = x1
    y11 = y1
    x22 = x2
    y22 = y2
    if i == 0:
        if x11 - 1 < 1 or y11 + 2 > 8:
            continue
        else:
            x11 -= 1
            y11 += 2
            if abs(x11 - x22) == abs(y11 - y22):
                print("YES")
                exit()

    elif i == 1:
        if x11 + 1 > 8 or y11 + 2 > 8:
            continue
        else:
            x11 += 1
            y11 += 2
            if abs(x11 - x22) == abs(y11 - y22):
                print("YES")
                exit()
    elif i==2:
        if x11-1<1 or y11-2<1:
            continue
        else:
            x11 -= 1
            y11 -= 2
            if abs(x11 - x22) == abs(y11 - y22):
                print("YES")
                exit()
    else:
        if x11+1>8 or y11-2<1:
            continue
        else:
            x11 += 1
            y11 -= 2
            if abs(x11 - x22) == abs(y11 - y22):
                print("YES")
                exit()
print('NO')

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

Автор решения: Vladimir Ignatenko

Не очень понятно почему не проходит тест - было бы полезно знать условия этого теста.

Но могу предположить, что организаторы теста "подловили" вас на ситуации, когда конечная точка совпадает с точкой, куда фигура попадает после хода коня.

Т.е. с точки зрения условия задачи фигура обязательно должна сделать два движения: одно как конь и второе как слон. Но если после первого движения фигура попадает в конечную точку, то условие не выполняется.

А ваша проверка if abs(x11 - x22) == abs(y11 - y22): в этом случае дает истину так как в этом случае разница даст 0 и 0 == 9

Т.е. вам в данную првоерку надо добавить условие, что координаты не совпадают. Например,

if x11 != x22 and y11 != y22 and abs(x11 - x22) == abs(y11 - y22):

→ Ссылка
Автор решения: Stanislav Volodarskiy

Всего 4096 возможных пар позиций для тестов. Из них 300 ошибок.

64 ошибки типа YES - ходы при которых фигура остаётся на месте. За отвечает специальный if в коде, так что я не на сто процентов уверен что это именно ошибка.

232 ошибки типа NO связаны с тем что вы анализируете только четыре хода коня из восьми. Примеры ошибок: (1, 1)-(2, 1) → NO, (4, 2)-(8, 3) → NO.

Четыре ошибки YES - ходы вокруг углов: (2, 1)-(1, 3) → YES, (2, 8)-(1, 6) → YES, (7, 1)-(8, 3) → YES, (7, 8)-(8, 6) → YES.

Код проверяет восемь ходов коня. Ход должен заканчиваться в пределах доски. Потом проверяется что после хода коня мы на одной диагонали с целевой клеткой, но не в самой целевой клетке.

Для проверки сравнивались ответы вашей и этой программ для всех возможных пар клеток.

x1, y1, x2, y2 = map(int, input().split())
for dx, dy in (
    ( 2,  1), ( 1,  2), (-1,  2), (-2,  1),
    (-2, -1), (-1, -2), ( 1, -2), ( 2, -1)
):
    x3 = x1 + dx
    y3 = y1 + dy
    if 1 <= x3 <= 8 and 1 <= y3 <= 8 and abs(x2 - x3) == abs(y2 - y3) != 0:
        print('YES')
        break
else:
    print('NO')
→ Ссылка