栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

2n皇后问题(python)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2n皇后问题(python)

采用深度优先+剪枝的算法。
基本思路是先排序黑皇后,再排序白皇后。

n = int(input())
ls = [[int(x) for x in input().split()] for i in range(n)]
# 结果res
res = 0
# 代表hasblack[j]第j列是否有black,1代表有
hasblack = [0 for i in range(n)]
haswhite = [0 for i in range(n)]
# 递归的深度优先加剪枝

# 剪枝函数
def isOk(i, j, bw):
    # 考虑同列是否有
    if bw == 2 and hasblack[j] == 1:
        return False
    if bw == 3 and haswhite[j] == 1:
        return False
    # 考虑左上面的对角线
    t = min(i, j)
    for k in range(t):
        if ls[i-k-1][j-k-1] == bw:
            return False
    # 考虑右上方对角线
    t = min(i, n-j-1)
    for k in range(t):
        if ls[i-k-1][j+k+1] == bw:
            return False
    return True

# 在第i行放black or white皇后
def dfs(ls, i, bw):
    global res, hasblack, haswhite
    # 递归出口
    if i == n:
        # 白皇后放完了,res ++
        if bw == 3:
            res += 1
        # 黑皇后放完了,放白
        else:
            dfs(ls, 0, 3)
            
    else:
        # 放黑皇后
        if bw == 2:
            for j in range(n):
                # 能放且不与之前的冲突
                if ls[i][j] == 1 and isOk(i, j, bw):
                    ls[i][j] = bw
                    hasblack[j] = 1
                    dfs(ls, i+1, bw)
                    hasblack[j] = 0
                    ls[i][j] = 1
        #放白皇后
        if bw == 3:
            for j in range(n):
                # 能放且不与之前的冲突
                if ls[i][j] == 1 and isOk(i, j, bw):
                    ls[i][j] = bw
                    haswhite[j] = 1
                    dfs(ls, i+1, bw)
                    haswhite[j] = 0
                    ls[i][j] = 1


            
dfs(ls, 0, 2)
print(res)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/754533.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号