Не работает блок else вложенный в блок elif в цикле for, но блок if вложенный в цикл выполняется
a = int(input())
n = [input() for i in range(a)]
for i in n:
x = [_ for _ in range(ord(i[0]) - 98, ord(i[0]) - 93) if _ in range(1, 9)]
y = [_ for _ in range(int(i[1]) - 2, int(i[1]) + 3) if _ in range(1, 9)]
res = 0
x_min = [_ for _ in x if _ < ord(i[0]) - 96]
x_max = [_ for _ in x if _ > ord(i[0]) - 96]
# print(x, y,x_max, x_min, sep='\n')
if len(x_min) > 0:
if len(x_min) > 1:
res += len(y) - 1
else:
res += len(y) - 1 // 2
elif len(x_max) > 0:
if len(x_max) > 1:
res += len(y)
else:
res += len(y) - 1 // 2
print(res)
Ввод:
3
a1
d4
g6
Вывод:
3
4
4
По задумке код должен определить количество возможных клеток куда может сходить конь. Сначала вводится количество тестов, а потом сами тесты. Выводится количество возможных позиций после хода.
Ответы (1 шт):
Для решения подобных шахматных задач хорошо подходит битовая арифметика.
Клетка доски соответствует биту в 64 - разрядном числе. Пример можно посмотреть здесь.
Для раскладки: "A1 - бит 0, A1 - бит 2, ... H8 - бит 63", код определения всех вариантов хода коня будет выглядит так:
def knight_move(p):
""" p - номер клетки в которой находится конь"""
assert p < 64 and p >= 0
p = 1 << p
nA = 0xFEFEFEFEFEFEFEFE
nH = 0x7F7F7F7F7F7F7F7F
nAB = 0xFCFCFCFCFCFCFCFC
nGH = 0x3F3F3F3F3F3F3F3F
board = (
nGH & (p << 6 | p >> 10)
| nH & (p << 15 | p >> 17)
| nA & (p << 17 | p >> 15)
| nAB & (p << 10 | p >> 6)
)
return board & 0xFFFFFFFFFFFFFFFF
Функция возвращает число с битами - возможными позициями коня. В ней вообще нет циклов. Количество единичных бит - количество возможных ходов фигуры.
Для подсчета количества единичных бит можно воспользоваться такой функцией:
def bitcount_rare(x):
"""Подсчет битов в QWORD для малозаполненных значений"""
n = 0
while x:
n += 1
x = x & (x - 1)
return n