这里有新鲜出炉的Python3 官方中文指南,程序狗速度看过来!
Python 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。
这篇文章主要介绍了Python基于回溯法子集树模板实现8皇后问题,简单说明了8皇后问题的原理并结合实例形式分析了Python回溯法子集树模板解决8皇后问题的具体实现技巧,需要的朋友可以参考下
本文实例讲述了Python基于回溯法子集树模板实现8皇后问题。分享给大家供大家参考,具体如下:
问题
8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
分析
为了简化问题,考虑到8个皇后不同行,则每一行放置一个皇后,每一行的皇后可以放置于第0、1、2、...、7列,我们认为每一行的皇后有8种状态。那么,我们只要套用子集树模板,从第0行开始,自上而下,对每一行的皇后,遍历它的8个状态即可。
代码:
- '''
- 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程序设计有所帮助。
来源: http://www.phperz.com/article/17/0911/345542.html