N皇后问题python实现

N皇后问题python实现

常规解法

def is_valid(board, row, col):
    """
    判断在第row行第col列放置皇后是否合法
    """
    # 检查同一列是否有皇后
    for i in range(row):
        if board[i][col] == 'Q':
            return False
    # 检查右上方是否有皇后
    i, j = row - 1, col + 1
    while i >= 0 and j < len(board[0]):
        if board[i][j] == 'Q':
            return False
        i, j = i - 1, j + 1
    # 检查左上方是否有皇后
    i, j = row - 1, col - 1
    while i >= 0 and j >= 0:
        if board[i][j] == 'Q':
            return False
        i, j = i - 1, j - 1
    return True


def backtrack(board, row, res):
    """
    回溯函数,逐行放置皇后
    """
    if row == len(board):
        # 找到一组解,添加到结果列表中
        res.append(["".join(row) for row in board])
        return
    for col in range(len(board[0])):
        if is_valid(board, row, col):
            # 在该位置放置皇后
            board[row][col] = 'Q'
            # 递归到下一行
            backtrack(board, row + 1, res)
            # 恢复原状
            board[row][col] = '.'


def solve_n_queens(n):
    """
    解决N皇后问题
    """
    board = [['.' for _ in range(n)] for _ in range(n)]
    res = []
    backtrack(board, 0, res)
    return res
n = int(input())
res = solve_n_queens(n)
print(len(res))

优化

import os
import sys

# 请在此输入您的代码
def can_place(queen, row, col):
    # 检查是否和前面的皇后在同一列或同一对角线
    for i in range(row):
        if queen[i] == col or abs(row - i) == abs(col - queen[i]):
            return False
    # 检查是否符合额外限制条件
    if row >= 2 and abs(queen[row-2] - col) == 1 and abs(queen[row-1] - col) == 1:
        return False
    return True

def backtrack(queen, row, n, count):
    if row == n:
        # 找到一个合法解法,计数器加一
        count[0] += 1
    else:
        for col in range(n):
            if can_place(queen, row, col):
                queen[row] = col
                backtrack(queen, row+1, n, count)
                queen[row] = -1

def n_queens(n):
    queen = [-1] * n
    count = [0]
    backtrack(queen, 0, n, count)
    return count[0]
n = int(input())
print(n_queens(n))  

该算法的时间复杂度为 O(n^n),空间复杂度为 O(n),因为需要记录每一行皇后的位置和计数器。对于较小的 n,该算法可以得到较快的解决,但对于较大的 n,算法的时间复杂度会变得非常高,不适合实际使用。因此,有必要使用更高效的算法来解决 N 皇后问题,例如基于位运算的算法或基于优化的启发式搜索算法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值