Задача про ходы пешки Python
Условие задачи
Вам дана начальная клетка s белой Пешки на пустой шахматной доске 8×8, а также клетка t, в которой Пешка хочет оказаться.
Пешка должна сделать ровно два хода. Нужно определить, сможет ли Пешка через два хода попасть в клетку t.
Правила ходов
- Пешка ходит вперёд (к большим номерам горизонталей):
- на 1 клетку:
(х, у) -> (х, у + 1)
; - со 2-й горизонтали может пойти сразу на 2 клетки:
(x, 2) -> (x, 4)
.
- на 1 клетку:
- Если после хода Пешка достигает 8-й горизонтали, она немедленно превращается в одну из фигур на ваш выбор: ферзь, ладья, слон или конь.
- Если превращение произошло на первом ходу, то второй ход делает уже новая фигура по обычным шахматным правилам на пустой доске.
- Взятие на проходе отсутствует.
Формат входных данных
Первая строка содержит целое число Т - количество тестов (1 <= Т <= 10000).
Каждый из следующих Т тестов содержит по две строки s и t - клетки в шахматной нотации (а1 ... h8).
Гарантируется, что начальная клетка s находится на 2-7й горизонтали (Пешка ещё не на 8-й).
Формат выходных данных
Для каждою теста выведите YES, если можно попасть в клетку t ровно за два хода, и NO в противном случае.
Ограничение по времени: 2 секунды
Ограничение по памяти: 256 мегабайт
Пример
стандартный ввод | стандартный вывод |
---|---|
5 | |
e2 e5 | YES |
e2 eЗ | NO |
a7 g8 | YES |
a7 a8 | NO |
c7 e7 | YES |
Моё решение
n=int(input())
for _ in range(n):
st,fin=map(str,input().split())
hodi = set()
if int(st[1])==2:
hodi.add(st[0]+'4')
hodi.add(st[0]+'5')
elif int(st[1]) < 7:
hodi.add(st[0]+str(int(st[1])+2))
else:
# королева
for i in range(ord('a'),ord('h')+1):
hodi.add(chr(i)+'8')
w=ord(st[0])-1
h=7
while w >=ord('a'):
hodi.add(chr(w)+str(h))
h-=1
w-=1
w=ord(st[0])+1
h=7
while w <=ord('h'):
hodi.add(chr(w)+str(h))
h-=1
w+=1
# конь
point = ord(st[0])
zero = ord('a')
full = ord('h')
if point - zero >= 2:
hodi.add(chr(point-2)+'7')
if point - zero >= 1:
hodi.add(chr(point-1)+'6')
if full - point >= 2:
hodi.add(chr(point+2)+'7')
if full - point >= 2:
hodi.add(chr(point+1)+'6')
for i in range(1,8):
hodi.add(st[0]+str(i))
hodi.remove((st[0]+'8'))
if fin in hodi:
print('YES')
else:
print('NO')
Проходит только 1 тест, не понимаю где ошибка.
Исходный скрин с условием задачи (в примерах обрезан шестой тест, поэтому выше в распознанном тексте число 6
в первой строке заменено на 5
и удален YES
в последней строке, который относится к обрезанному тесту, а содержимое второго столбца смещено на одну строку вниз, чтобы визуально совместить тест и ожидаемый результат):
Ответы (1 шт):
Я протестировал вашу программу на всех возможных входах и нашёл одну единственную ошибку: g7 h6
→ NO
. Но с поля g7
пешка идёт на g8
, превращается в коня, который может пойти с g8
на h6
.
Чтобы её исправить, замените последнее условие для коня в строке 36 на
if full - point >= 1:
.