Непонятная ошибка в проверке хода конеслона
Некоторые из вас могут играть в шахматы, но мы совершенно точно убеждены, что вы еще не слышали про новую фигуру в них! Правда, ее введение находится на этапе согласования... но Комитет по Стандартизации Шахмат уже имеет полное видение ее игровой механики. Новая фигура будет называться «Кочевник» и ее ход состоит из комбинации ходов двух уже обыденных фигур. Сначала Кочевник ходит как Конь, а потом — как Слон, и все это обязательно выполняется в рамках одного хода. Вам предоставлен доступ к тестовой шахматной доске, чтобы вы могли опробовать новую фигуру. Формат входных данных В единственной строке входного файла вводятся четыре натуральных числа 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 шт):
Не очень понятно почему не проходит тест - было бы полезно знать условия этого теста.
Но могу предположить, что организаторы теста "подловили" вас на ситуации, когда конечная точка совпадает с точкой, куда фигура попадает после хода коня.
Т.е. с точки зрения условия задачи фигура обязательно должна сделать два движения: одно как конь и второе как слон. Но если после первого движения фигура попадает в конечную точку, то условие не выполняется.
А ваша проверка if abs(x11 - x22) == abs(y11 - y22):
в этом случае дает истину так как в этом случае разница даст 0 и 0 == 9
Т.е. вам в данную првоерку надо добавить условие, что координаты не совпадают. Например,
if x11 != x22 and y11 != y22 and abs(x11 - x22) == abs(y11 - y22):
Всего 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')