【打卡-蓝桥杯】Day 8

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

在这里插入图片描述

解题思路

深度优先算法(可以自己画一下深度优先的遍历树)
1、先放白皇后,按照白皇后,不能同行、同列、同对角线,进行放置。循环列,递归行。
2、递归终止条件是行和输入的n相等
3、白皇后放置完成后,放置黑皇后,放置方法与白皇后一致,递归终止条件仍然是行和输入的n相等

代码

# 判断 白皇后 是否可以放置
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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值