八皇后问题

八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。 如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。 而我们今天要挑战的是N皇后的问题,即在NxN 的棋盘上,放置N 个皇后,使得它们不相互攻击(即任意 2 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45° 角的斜线上。 你的任务是,对于给定的 N,求出有多少种合法的放置方法。

x = [0]*50
n = 0
number
def pd(k):  #判断该皇后是否与之前存放的皇后存在同一斜线或同一列
    for i in range(1,k):
        if abs(k-i) == abs(x[k] - x[i]):
            return 0
        elif x[k] == x[i]:
            return 0
    return 1

def check(a):   #如果a>n,则说明n个皇后都已经存放好,此时方案数加一,并返回上一级
    global number
    if a>n:
        number += 1
    else:
        return False
    return True

def DFS(num):
    if check(num):    #判断n个皇后是否已经全部放好
        return
    else:
        for i in range(1,n+1):  #循环条件是列数,从第一列开始遍历
            x[num] = i
            if pd(num):   #判断该皇后的位置是否与之前的皇后位置处于同一斜线或同一行
                DFS(num+1)    
            else:
                continue

n = int(input())
DFS(1)
print(number)  #输出方案数

解答:从第一行开始,每一行存放一个皇后,通过判断与其他皇后是否处于同一列或同一行或45度斜线,选出满足题意的解答,使得方案数加一。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

缱绻命运

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

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

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

打赏作者

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

抵扣说明:

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

余额充值