#53992: 有沒有人python不打表寫完的


tjmmy0123456789@gmail.com (12345)


python 算到16皇后又沒有可能不爆tle

#53993: Re: 有沒有人python不打表寫完的


tjmmy0123456789@gmail.com (12345)


python 算到16皇后又沒有可能不爆tle

過了

import sys

sys.setrecursionlimit(10000)

def count_n_queens(n: int) -> int:
    if n == 0:
        return 1
    if n < 0:
        return 0
    all_ones = (1 << n) - 1

    def backtrack(cols: int, diag_l: int, diag_r: int) -> int:
        if cols == all_ones:
            return 1
        cnt = 0
        avail = all_ones & ~(cols | diag_l | diag_r)
        while avail:
            bit = avail & -avail
            avail -= bit
            cnt += backtrack(cols | bit, ((diag_l | bit) << 1) & all_ones, (diag_r | bit) >> 1)
        return cnt

    total = 0
    half = n // 2
    for c in range(half):
        b = 1 << c
        total += backtrack(b, (b << 1) & all_ones, b >> 1)
    total *= 2
    if n % 2 == 1:
        center = 1 << half
        total += backtrack(center, (center << 1) & all_ones, center >> 1)
    return total

def main():
    data = sys.stdin.buffer.read().split()
    if not data:
        return
    ns = []
    for token in data:
        try:
            ns.append(int(token))
        except:
            ns.append(0)
    result_cache = {}
    uniq = set(ns)
    for n in uniq:
        result_cache[n] = count_n_queens(n)
    out = "\n".join(str(result_cache[n]) for n in ns)
    sys.stdout.write(out)

if __name__ == "__main__":
    main()