python利用递归实现Nqueen(n皇后)问题

解决N皇后问题是一个经典的递归问题,其目标是在一个N×N的棋盘上放置N个皇后,使得它们互相不能攻击到对方(即不在同一行、同一列、同一斜线上)。下面是我们利用递归解决N皇后问题的思路:

1. 定义递归函数:首先我们定义一个递归函数`solveNQueens(row, n, board, result)`,其中`row`表示当前处理的行数,`n`表示总共的皇后数量,`board`表示当前的棋盘状态,`result`表示存储最终结果的列表。

2. 基本情况:在递归函数中,我们首先需要定义基本情况。当`row == n`时,表示已经成功放置了n个皇后,将当前棋盘状态加入结果列表中。

3. 递归情况:在处理第`row`行时,我们需要尝试在该行的每一个位置放置皇后,并检查是否与之前的皇后位置冲突。如果不冲突,则将皇后放置在该位置,继续递归处理下一行。

4. 检查冲突:在放置皇后时,需要检查当前位置是否与之前的皇后位置冲突。即检查同一列、同一对角线上是否有其他皇后。

5. 回溯:如果在某一行无法找到合适位置放置皇后,需要回溯到上一行,尝试其他位置。

6. 返回结果:最终递归函数会返回所有合法的放置方式,我们可以在主函数中调用递归函数,并输出结果。

总的来说,利用递归解决N皇后问题的思路是通过递归尝试在每一行放置皇后,并检查是否与之前的皇后位置冲突,直到放置完所有皇后或无法找到合法位置。递归的思路能够清晰地表达问题的解决方式,并且能够高效地解决N皇后问题。
 

N = 4
arr = [0] * N
for i in range(N):
    arr[i] = [0] * N
count = 0

# 检查当前位置是否危险
def isDangerous(row, col):
    # 检查正上方是否有皇后
    r = row - 1
    while r >= 0:
        if arr[r][col] == 1:
            return True
        r -= 1

    # 检查左上方是否有皇后
    r = row - 1
    c = col - 1
    while r >= 0 and c >= 0:
        if arr[r][c] == 1:
            return True
        r -= 1
        c -= 1

    # 检查右上方是否有皇后
    r = row - 1
    c = col + 1
    while r >= 0 and c < N:
        if arr[r][c] == 1:
            return True
        r -= 1
        c += 1
    return False

# 递归求解N皇后问题
def nQueen(row):
    if row == N:
        global count
        count += 1
        print(f"第{count}种解:")
        for i in range(N):
            for j in range(N):
                print(arr[i][j], end=" ")
            print()
    else:
        for col in range(N):
            if not isDangerous(row, col):
                arr[row][col] = 1
                nQueen(row + 1)
                arr[row][col] = 0

def main():
    nQueen(0)

if __name__ == "__main__":
    main()

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值