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使用pyinstaller打包含有gettext locales语言环境的项目(推荐)

    Python使用pyinstaller打包含有gettext locales语言环境的项目(推荐)

    最近在用 pyhton 做一个图片处理的小工具,顺便接触了gettext,用来实现本地化化中英文转换,本文通过一个项目给大家详细介绍下,感兴趣的朋友跟随小编一起看看吧
    2022-01-01
  • 详解Python中 __get__和__getattr__和__getattribute__的区别

    详解Python中 __get__和__getattr__和__getattribute__的区别

    __get__、__getattr__、__getattribute都是访问属性的方法,但作用不太相同,这里我们就来详解Python中 __get__和__getattr__和__getattribute__的区别:
    2016-06-06
  • numpy中tensordot的用法

    numpy中tensordot的用法

    本文主要介绍了numpy中tensordot的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Django把SQLite数据库转换为Mysql数据库的过程

    Django把SQLite数据库转换为Mysql数据库的过程

    之前我们默认使用的是SQLite数据库,我们开发完成之后,里面有许多数据,如果我们想转换成Mysql数据库,那我们先得把旧数据从SQLite导出,然后再导入到新的Mysql数据库里去,这篇文章主要介绍了Django如何把SQLite数据库转换为Mysql数据库,需要的朋友可以参考下
    2023-05-05
  • python基于Selenium的web自动化框架

    python基于Selenium的web自动化框架

    这篇文章主要介绍了python基于Selenium的web自动化框架,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python通过串口实现收发文件

    Python通过串口实现收发文件

    这篇文章主要为大家详细介绍了Python如何通过串口实现收发文件功能,文中的示例代码简洁易懂,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • python orm 框架中sqlalchemy用法实例详解

    python orm 框架中sqlalchemy用法实例详解

    这篇文章主要介绍了python orm 框架中sqlalchemy用法,结合实例形式详细分析了Python orm 框架基本概念、原理及sqlalchemy相关使用技巧,需要的朋友可以参考下
    2020-02-02
  • python游戏库pygame经典教程(推荐!)

    python游戏库pygame经典教程(推荐!)

    Python Pygame是一款专门为开发和设计 2D 电子游戏而生的软件包,是入门级游戏开发库,下面这篇文章主要给大家介绍了python游戏库pygame经典教程的相关资料,需要的朋友可以参考下
    2022-12-12
  • py3nvml实现GPU相关信息读取的案例分析

    py3nvml实现GPU相关信息读取的案例分析

    这篇文章主要介绍了py3nvml实现GPU相关信息读取,此时就可以考虑使用py3nvml这样的工具,针对于GPU任务执行的过程进行细化的分析,有助于提升GPU的利用率和程序执行的性能,需要的朋友可以参考下
    2022-01-01
  • Python学习笔记之解析json的方法分析

    Python学习笔记之解析json的方法分析

    这篇文章主要介绍了Python解析json的方法,结合实例形式分析了常见的Python解析与转换json格式数据相关操作技巧,需要的朋友可以参考下
    2017-04-04

最新评论