N皇后问题(Python实现)

N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。

# 判断能不能放
def pd(k):
    # k是当前行, i是搜索行
    # 搜索每个对角线和每一列有没有皇后
    for i in range(1, k):
        # 对角线
        if abs(k - i) == abs(x[k] - x[i]):
            return False
        # 同一列
        elif x[k] == x[i]:
            return False
    # 都不存在就能放
    return True


# 判断边界
def check(a):
    if a > n:
        global count
        count += 1
    else:
        return False
    return True


# 第 a 行
def dfs(a):
    # 超出边界, 则结果加1, 并回溯到上一行皇后的位置
    if check(a):
        return
    # 没有超出边界,则开始放下一行的皇后
    else:
        # 第 i 列
        for i in range(1, n + 1):
            # 能不能放在这个位置, 第 a 行 第 i 列
            x[a] = i
            # 能放就放下一个, 不能放就看下一列
            if pd(a):
                dfs(a + 1)
            else:
                continue


if __name__ == '__main__':
    count = 0
    n = int(input())
    # 皇后列坐标
    x = [0] * (n + 1)
    # 从第一行开始搜索
    dfs(1)
    print(count)

你可能感兴趣的:(算法,深度优先,算法,leetcode)