N皇后问题(Python实现)

N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。

# 判断能不能放
def pd(k):
    # k是当前行, i是搜索行
    # 搜索每个对角线和每一列有没有皇后
    for i in range(1, k):
        # 对角线
        if abs(k - i) == abs(x[k] - x[i]):
            return False
        # 同一列
        elif x[k] == x[i]:
            return False
    # 都不存在就能放
    return True


# 判断边界
def check(a):
    if a > n:
        global count
        count += 1
    else:
        return False
    return True


# 第 a 行
def dfs(a):
    # 超出边界, 则结果加1, 并回溯到上一行皇后的位置
    if check(a):
        return
    # 没有超出边界,则开始放下一行的皇后
    else:
        # 第 i 列
        for i in range(1, n + 1):
            # 能不能放在这个位置, 第 a 行 第 i 列
            x[a] = i
            # 能放就放下一个, 不能放就看下一列
            if pd(a):
                dfs(a + 1)
            else:
                continue


if __name__ == '__main__':
    count = 0
    n = int(input())
    # 皇后列坐标
    x = [0] * (n + 1)
    # 从第一行开始搜索
    dfs(1)
    print(count)

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是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函数求解问题。最终,它会返回所有可能的解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iFulling

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值