DFS-N皇后问题(python)

解题关键:


我们用数组 x[a]=i 来表示第 a 个皇后的位置在第 a 行第 i 列,我们不用考虑是否在同一行的问题(因为a代表行数),我们只用判断之前的 1 到 a-1 个皇后的位置和当前第 a 个皇后的位置是否属于同一列或者斜线。

判断是否属于同一列: 就判断 x[a]是否等于 x[i]; 判断是否属于同一斜线:等同于判断行之差是否等于列之差也,即 abs(x[k]-x[i])||x[k]==x[i]。

import sys


def check(a):
    global n, sum
    if a > n:  # 说明这一轮的放置已经完成,存在这一种放法,所以sum++
        sum += 1
    else:
        return False
    return True


def judge(a):
    for i in range(1, a):  # 传入的a代表行数(或者是第a个皇后),所以比较范围从第一行到第a行
        if abs(a - i) == abs(x[a] - x[i]):  # 判断是否在同一斜线上等同判断行之差是否等于列之差
            return 0
        elif x[a] == x[i]:  # 判断是否在同一列上
            return 0
    return 1


def DFS(a):
    if check(a):
        return  # 该return仅结束其中一次循环,变相有很多循环在执行
    for i in range(1, n + 1):
        x[a] = i  # 即第a个皇后放置在第i列
        if judge(a):  # 判断是否可以放置在该处
            DFS(a + 1)
        else:
            continue  # 即使第i列不可以,continue之后,x[a]的值也会改变,不影响后续


n = int(sys.stdin.readline().strip())
sum = 0
x = [0 for i in range(n + 1)]  # 下标代表行,值代表列
DFS(1)#代表从第一行第一个皇后开始放置
print(sum)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

谁动了我的马卡龙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值