解决Python基于回溯法子集树模板实现8皇后问题


本文摘自php中文网,作者巴扎黑,侵删。

这篇文章主要介绍了Python基于回溯法子集树模板实现8皇后问题,简单说明了8皇后问题的原理并结合实例形式分析了Python回溯法子集树模板解决8皇后问题的具体实现技巧,需要的朋友可以参考下

本文实例讲述了Python基于回溯法子集树模板实现8皇后问题。分享给大家供大家参考,具体如下:

问题

8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

分析

为了简化问题,考虑到8个皇后不同行,则每一行放置一个皇后,每一行的皇后可以放置于第0、1、2、...、7列,我们认为每一行的皇后有8种状态。那么,我们只要套用子集树模板,从第0行开始,自上而下,对每一行的皇后,遍历它的8个状态即可。

代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

'''

8皇后问题

'''

n = 8

x = [] # 一个解(n元数组)

X = [] # 一组解

# 冲突检测:判断 x[k] 是否与前 x[0~k-1] 冲突

def conflict(k):

 global x

 for i in range(k):        # 遍历前 x[0~k-1]

  if x[i]==x[k] or abs(x[i]-x[k])==abs(i-k): # 判断是否与 x[k] 冲突

   return True

 return False

# 套用子集树模板

def queens(k): # 到达第k行

 global n, x, X

 if k >= n:   # 超出最底行

  #print(x)

  X.append(x[:]) # 保存(一个解),注意x[:]

 else:

  for i in range(n): # 遍历第 0~n-1 列(即n个状态)

   x.append(i)  # 皇后置于第i列,入栈

   if not conflict(k): # 剪枝

    queens(k+1)

   x.pop()   # 回溯,出栈

# 解的可视化(根据一个解x,复原棋盘。'X'表示皇后)

def show(x):

 global n

 for i in range(n):

  print('. ' * (x[i]) + 'X ' + '. '*(n-x[i]-1))

# 测试

queens(0) # 从第0行开始

print(X[-1], '\n')

show(X[-1])

效果图

以上就是解决Python基于回溯法子集树模板实现8皇后问题的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

Python的除法运算符是什么

Python学习必备知识汇总

Python求n的阶乘

Python中集合是什么?简单的集合操作

怎么用Python绘制圆

Python中strip()函数有什么用法

Python怎么安装运行

监控Python logcat关键字

介绍Python中星号变量的特殊用法

Python安装扩展库常用的是什么工具

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...