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

 更新时间:2017年09月01日 08:58:08   作者:罗兵  
这篇文章主要介绍了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相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程

希望本文所述对大家Python程序设计有所帮助。

相关文章

  • Python面向对象之入门类和对象

    Python面向对象之入门类和对象

    这篇文章主要为大家介绍了Python入门类和对象,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • 使用fiddler抓包工具Python requests报错:ValueError: check_hostname requires server_hostname的解决

    使用fiddler抓包工具Python requests报错:ValueError: check_h

    这篇文章主要介绍了使用fiddler抓包工具Python requests报错:ValueError: check_hostname requires server_hostname的解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 在python中实现将一张图片剪切成四份的方法

    在python中实现将一张图片剪切成四份的方法

    今天小编就为大家分享一篇在python中实现将一张图片剪切成四份的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Opencv实现二维直方图的计算及绘制

    Opencv实现二维直方图的计算及绘制

    这篇博客将介绍如何使用Opencv进行二维直方图的计算及绘制,维直方图可以让我们对不同的像素密度有更好的了解,感兴趣的可以了解一下
    2021-07-07
  • Python爬虫网页元素定位术

    Python爬虫网页元素定位术

    这篇文章主要介绍了Python爬虫网页元素定位术,文章通过Beautiful Soup模块展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • Python学习之字符串格式化

    Python学习之字符串格式化

    这篇文章主要介绍了Python实现字符串格式化输出的方法,结合具体实例形式总结分析了Python字符串格式化输出的各种常用操作技巧,需要的朋友可以参考下
    2021-10-10
  • 解决pycharm工程启动卡住没反应的问题

    解决pycharm工程启动卡住没反应的问题

    今天小编就为大家分享一篇解决pycharm工程启动卡住没反应的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python反射和内置方法重写操作详解

    Python反射和内置方法重写操作详解

    这篇文章主要介绍了Python反射和内置方法重写,结合实例形式较为详细的分析了Python反射概念、原理及内置方法重写相关操作技巧与注意事项,需要的朋友可以参考下
    2018-08-08
  • python通用数据库操作工具 pydbclib的使用简介

    python通用数据库操作工具 pydbclib的使用简介

    这篇文章主要介绍了python通用数据库操作工具 pydbclib的使用简介,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-12-12
  • 使用sklearn之LabelEncoder将Label标准化的方法

    使用sklearn之LabelEncoder将Label标准化的方法

    今天小编就为大家分享一篇使用sklearn之LabelEncoder将Label标准化的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07

最新评论