Python基于回溯法子集树模板解决马踏棋盘问题示例


Posted in Python onSeptember 11, 2017

本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题。分享给大家供大家参考,具体如下:

问题

将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方格,要求每个方格进入且只进入一次,找出一种可行的方案。

分析

Python基于回溯法子集树模板解决马踏棋盘问题示例

说明:这个图是5*5的棋盘。

类似于迷宫问题,只不过此问题的解长度固定为64

每到一格,就有[(-2,1),(-1,2),(1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1)]顺时针8个方向可以选择。

走到一格称为走了一步,把每一步看作元素,8个方向看作这一步的状态空间。

套用回溯法子集树模板。

代码

'''马踏棋盘'''
n = 5 # 8太慢了,改为5
p = [(-2,1),(-1,2),(1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1)] # 状态空间,8个方向
entry = (2,2) # 出发地
x = [None]*(n*n) # 一个解,长度固定64,形如[(2,2),(4,3),...]
X = []    # 一组解
# 冲突检测
def conflict(k):
  global n,p, x, X
  # 步子 x[k] 超出边界
  if x[k][0] < 0 or x[k][0] >= n or x[k][1] < 0 or x[k][1] >= n:
    return True
  # 步子 x[k] 已经走过
  if x[k] in x[:k]:
    return True
  return False # 无冲突
# 回溯法(递归版本)
def subsets(k): # 到达第k个元素
  global n, p, x, X
  if k == n*n: # 超出最尾的元素
    print(x)
    #X.append(x[:]) # 保存(一个解)
  else:
    for i in p: # 遍历元素 x[k-1] 的状态空间: 8个方向
      x[k] = (x[k-1][0] + i[0], x[k-1][1] + i[1])
      if not conflict(k): # 剪枝
        subsets(k+1)
# 测试
x[0] = entry # 入口
subsets(1)  # 开始走第k=1步

效果图

Python基于回溯法子集树模板解决马踏棋盘问题示例

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

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

Python 相关文章推荐
python重试装饰器示例
Feb 11 Python
Python将xml和xsl转换为html的方法
Mar 10 Python
Python SVM(支持向量机)实现方法完整示例
Jun 19 Python
python二维列表一维列表的互相转换实例
Jul 02 Python
浅谈python 中类属性共享的问题
Jul 02 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
Feb 27 Python
Python基于paramunittest模块实现excl参数化
Apr 26 Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 Python
python 实现弹球游戏的示例代码
Nov 17 Python
python实现马丁策略回测3000只股票的实例代码
Jan 22 Python
Python实现将多张图片合成MP4视频并加入背景音乐
Apr 28 Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 #Python
详解 Python 与文件对象共事的实例
Sep 11 #Python
Python 私有函数的实例详解
Sep 11 #Python
Python模拟用户登录验证
Sep 11 #Python
Python模拟三级菜单效果
Sep 11 #Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 #Python
Python 模拟购物车的实例讲解
Sep 11 #Python
You might like
php mail to 配置详解
2014/01/16 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
Yii2使用表单上传文件的实例代码
2017/08/03 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
jQuery Animation实现CSS3动画示例介绍
2013/08/14 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
nodejs使用redis作为缓存介质实现的封装缓存类示例
2018/02/07 NodeJs
vue slot 在子组件中显示父组件传递的模板
2018/03/02 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
微信小程序实现星级评价效果
2018/12/28 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
Python编程pygal绘图实例之XY线
2017/12/09 Python
单利模式及python实现方式详解
2018/03/20 Python
python使用Tesseract库识别验证
2018/03/21 Python
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
django框架创建应用操作示例
2019/09/26 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
2020/02/07 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
学前教育毕业生自荐信
2013/10/29 职场文书
勇敢的心观后感
2015/06/09 职场文书
《角的度量》教学反思
2016/02/18 职场文书
Python音乐爬虫完美绕过反爬
2021/08/30 Python
mysql事务隔离级别详情
2021/10/24 MySQL
Html5同时支持多端sdk的小技巧
2021/11/17 HTML / CSS
关于ObjectUtils.isEmpty() 和 null 的区别
2022/02/28 Java/Android
Python保存并浏览用户的历史记录
2022/04/29 Python