栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

DFS-N皇后问题(python)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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)

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968952.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号