0
点赞
收藏
分享

微信扫一扫

【打卡-蓝桥杯】Day 8

大师的学徒 2022-02-19 阅读 70

题目 1 :基础练习 2n皇后问题

在这里插入图片描述

解题思路

代码

# 判断 白皇后 是否可以放置
def correctWhite(tmpWhite, row):
    if arr[row][tmpWhite[row]] == 1:    # 看棋盘中该位置是否可以放置
        for i in range(row):    # 判断条件为不在同一列,和不在同一对角线上
            if tmpWhite[i] == tmpWhite[row] or abs(tmpWhite[i] - tmpWhite[row]) == abs(i - row):
                return False
        return True
    else:
        return False

# 判断 黑皇后 是否可以放置
def correctBlack(tmpBlack, row, tmpWhite):
    if arr[row][tmpBlack[row]] == 1 and tmpBlack[row] != tmpWhite[row]:  # 看棋盘中该位置是否可以放置
        for i in range(row):  # 判断条件为不在同一列,和不在同一对角线上
            if tmpBlack[i] == tmpBlack[row] or abs(tmpBlack[i] - tmpBlack[row]) == abs(i - row):
                return False
        return True
    else:
        return False

# 放置黑皇后
def dfs_Black(tmpBlack, row):
    if row == n:
        # 黑皇后放置结束,ans+=1
        ans.append(tmpBlack)
        return      # 退出递归
    else:
        for col in range(n):  # 行确定,遍历列,寻找可以放置的位置
            tmpBlack[row] = col
            if correctBlack(tmpBlack, row, tmpWhite):  # 看是否可以放置
                dfs_Black(tmpBlack, row + 1)  # 放下一个白皇后
                
# 放置白皇后
def dfs_White(tmpWhite, row):
    if row == n:
        # 白皇后放置结束,放置黑皇后
        dfs_Black(tmpBlack, 0)
    else:
        for col in range(n):    # 行确定,遍历列,寻找可以放置的位置
            tmpWhite[row] = col
            if correctWhite(tmpWhite, row):     # 看是否可以放置
                dfs_White(tmpWhite, row+1)      # 放下一个白皇后


n = int(input())
# 创建棋盘
arr = [list(map(int, input().split())) for _ in range(n)]
# 临时存放白皇后棋盘
tmpWhite = [None for _ in range(n)]
# 临时存放黑皇后棋盘
tmpBlack = [None for _ in range(n)]
ans = []
# 先从白皇后开始放置
dfs_White(tmpWhite, 0)
print(len(ans))
举报

相关推荐

0 条评论