回溯算法——n皇后问题

  • N皇后问题,输入N,输出所有解的个数
  • 解题思路:
    可以使用一个一维数组存放皇后的位置,比如chess[i] = j,表示第i行的第j列有存放一个棋子,比起二维这样会省点空间。回溯结合深搜对所有情况继续穷举,符合就继续,不符合就回退。递归出口即是将所有的棋子已经放好,此时,行数已经到达最后一行+1.这里从第0行开始。
"""
# @Time    :  2020/11/26
# @Author  :  Jimou Chen
"""
n = int(input())
chess = [0 for _ in range(n)]  # 下标代表第i行,若为1,则表示第j列棋盘存放棋子
cnt = 0

# 检查棋子是否冲突,i是行,j是列
def check(i):
    for j in range(i):
        # 检查列和对角线
        if chess[i] == chess[j] or abs(chess[i] - chess[j]) == i - j:
            return 0
    return 1

# i表示现在已经放到第i行了
def dfs(i):
    global cnt
    if i == n:  # 能够放到最后一行说明这种情况符合
        cnt += 1
        print(chess)
        return

    for j in range(n):
        chess[i] = j  # 表示第i行第j列放皇后
        if check(i):
            dfs(i + 1)  # 符合条件就继续放下一行

if __name__ == '__main__':
    dfs(0)
    print('一共有{}种摆放方法'.format(cnt))

  • 运行结果

posted @ 2020-11-26 17:45  JackpotNeaya  阅读(209)  评论(0)    收藏  举报