n皇后问题python实现

练习:n皇后问题

n皇后问题其实是回溯算法,简单理解就是"逐步尝试,不可行退回上一步,然后更改上一步"

要注意,如果想要得出所有的解,那么最终结果可行依旧要回溯,直到遍历完所有的可能结果

import numpy as np

"""
n皇后问题
"""


def n_queen(start, map):
    for i in range(len(map[start])):
    	# 按行遍历
        map[start][i] = 1
        if check(map):
            if start < len(map) - 1:
                if not n_queen(start + 1, map):
                    map[start][i] = 0
            else:
                print(map)
                # 将已成立的结果打印出来
                map[start][i] = 0
                # 重置
        else:
            map[start][i] = 0
    return False


def check(map):
	# 用于判断是否有皇后处于同一行/列/斜线上
    line1 = set()
    line2 = set()
    line3 = set()
    line4 = set()
    for i in range(len(map)):
        for j in range(len(map)):
            if map[i][j] == 1:
                if i in line1:
                    return False
                if j in line2:
                    return False
                if i - j in line3:
                    return False
                if i + j in line4:
                    return False
                line1.add(i)
                line2.add(j)
                line3.add(i - j)
                line4.add(i + j)
    return True


if __name__ == "__main__":
    n = 8
    # 修改n来实现n皇后
    map = np.zeros([n, n])
    n_queen(0, map)

可以加一个全局变量用于统计解的个数

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是n皇后问题Python代码实现及解释: ```python def is_valid(board, row, col): """ 判断当前位置是否合法 """ n = len(board) for i in range(row): if board[i] == col or abs(row - i) == abs(col - board[i]): return False return True def backtrack(board, row, res): """ 回溯函数 """ n = len(board) if row == n: res.append(board[:]) return for i in range(n): if is_valid(board, row, i): board[row] = i backtrack(board, row + 1, res) board[row] = -1 def solve_n_queens(n): """ 解决n皇后问题 """ board = [-1] * n # 构造空棋盘 res = [] backtrack(board, 0, res) return res ``` 该代码实现n皇后问题的求解。在解释代码之前,让我们先了解一下n皇后问题的背景和规则。 n皇后问题是一种经典的回溯算法问题,其规则如下: 在一个$n \times n$的棋盘上放置n个皇后,使得每个皇后所在的行、列和对角线上都不存在其他皇后。其中,对角线包括正方向(左上到右下)和反方向(左下到右上)。 现在,让我们回到我们的代码。代码主要分为三个函数:`is_valid`、`backtrack`和`solve_n_queens`。 `is_valid`函数用于判断当前位置是否合法。对于当前位置$(row, col)$来说,其是否合法由以下条件决定: 1. 当前列上没有其他皇后; 2. 在之前的行里,不存在皇后和当前位置在同一对角线上。 满足上述两个条件则说明当前位置合法。 `backtrack`函数是回溯函数。其首先判断当前行是否为最后一行,如果是,则说明找到了一组解,并将其添加到结果列表里。否则,它会尝试将皇后逐个放在当前行的每一个位置上,并进入下一行继续放置。如果在某个位置上放置后发现无法继续前进,则回溯到上一行重新选择其他位置放置皇后。 `solve_n_queens`函数是解决n皇后问题的入口函数。它首先构造一个长度为n的空棋盘,并调用backtrack函数求解问题。最终,它会返回所有可能的解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值