八皇后问题(Python)

问题描述:

在8*8的国际象棋上,摆放八个皇后,使其不能相互攻击,即任意两个皇后不能在同一行,同一列,同一斜线上,问有多少种摆法?

chessboard = [[0 for _ in range(8)] for _ in range(8)]  # 生成8x8的棋盘0填充


def check_safe(point_x, point_y):
    # 检查列
    for row in chessboard:
        if row[point_y] == 1:
            return

    # 检查副对角线
    # y = +x + b
    b = point_y - point_x
    star_x = -b if b < 0 else 0
    end_x = 7 if b < 0 else 7 - b
    for x in range(star_x, end_x + 1):
        y = x + b
        if chessboard[x][y] == 1:
            return

    # 检查主对角线
    # y = -x + b
    b = point_y + point_x
    star_x = 0 if b < 8 else b - 7
    end_x = 7 if b > 7 else b
    for x in range(star_x, end_x + 1):
        y = -x + b
        if chessboard[x][y] == 1:
            return

    return True


def print_chessboard():
    print()
    for i in chessboard:
        print(i)


count = 0


def put_empress(x=0):
    for y in range(8):  # 通过循环拿到棋盘y坐标
        if not check_safe(x, y):
            # 进行下一次循环
            continue
        # 将皇后放在棋盘上
        if x == 7:
            global count
            count += 1
            # print_chessboard()
            return
        chessboard[x][y] = 1
        put_empress(x + 1)
        chessboard[x][y] = 0


put_empress()


print(count)

结果共有:92种放置方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
八皇后问题是一个经典的回溯算法问题,需要在8x8的棋盘上放置8个皇后,使得每个皇后都不会互相攻击(即不在同一行、同一列、同一对角线上)。 以下是使用Python实现的八皇后问题代码: ```python def is_valid(board, row, col): # 检查同一列中是否有皇后 for i in range(row): if board[i] == col: return False # 检查左上角对角线是否有皇后 i, j = row - 1, col - 1 while i >= 0 and j >= 0: if board[i] == j: return False i, j = i - 1, j - 1 # 检查右上角对角线是否有皇后 i, j = row - 1, col + 1 while i >= 0 and j < len(board): if board[i] == j: return False i, j = i - 1, j + 1 return True def backtracking(board, row, res): # 如果已经放置了8个皇后,将当前解添加到结果列表中 if row == len(board): res.append(board[:]) return # 尝试在当前行的每个列中放置皇后 for col in range(len(board)): if is_valid(board, row, col): board[row] = col backtracking(board, row + 1, res) board[row] = -1 def solve_n_queens(n): board = [-1] * n res = [] backtracking(board, 0, res) return res ``` 该代码使用回溯算法,首先定义了一个 `is_valid` 函数,用于检测当前位置是否可以放置皇后。然后定义了一个 `backtracking` 函数,用于递归地尝试在每一行放置皇后。最后,定义了一个 `solve_n_queens` 函数,用于调用 `backtracking` 函数并返回结果。 使用该函数解决八皇后问题的示例如下: ```python res = solve_n_queens(8) for board in res: print(board) ``` 输出结果为所有符合要求的解法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦为何欢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值