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素数检测的方法
May 11 Python
在Python的Flask框架中构建Web表单的教程
Jun 04 Python
Python下载网络小说实例代码
Feb 03 Python
在Django的View中使用asyncio的方法
Jul 12 Python
opencv实现简单人脸识别
Feb 19 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
Dec 25 Python
Pytorch释放显存占用方式
Jan 13 Python
彻底搞懂 python 中文乱码问题(深入分析)
Feb 28 Python
keras 权重保存和权重载入方式
May 21 Python
Python使用shutil模块实现文件拷贝
Jul 31 Python
pycharm debug 断点调试心得分享
Apr 16 Python
python ansible自动化运维工具执行流程
Jun 24 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具体实现代码
2010/10/12 PHP
php通过session防url攻击方法
2014/12/10 PHP
php数组去除空值函数分享
2015/02/02 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
PHP自定义错误用法示例
2016/09/28 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
让checkbox不选中即将选中的checkbox不选中
2014/07/11 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
浅谈JS中的反柯里化( uncurrying)
2017/08/17 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
Python设计模式之外观模式实例详解
2019/01/17 Python
在python里从协程返回一个值的示例
2019/02/19 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
python如何写try语句
2020/07/14 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
应届毕业生专业个人求职自荐信格式
2013/11/20 职场文书
幼儿园教师辞职信
2014/01/18 职场文书
小学庆六一活动总结
2014/08/28 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
安全检查汇报材料
2014/12/26 职场文书
面试复试通知单
2015/04/24 职场文书
交通事故被告答辩状
2015/05/22 职场文书
教师节祝酒词
2015/08/11 职场文书