八皇后问题(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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦为何欢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值