Не работает блок 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
→ Ссылка