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 实现插入排序算法
Jun 05 Python
python 计算两个日期相差多少个月实例代码
May 24 Python
Python使用 Beanstalkd 做异步任务处理的方法
Apr 24 Python
Python二进制串转换为通用字符串的方法
Jul 23 Python
python numpy元素的区间查找方法
Nov 14 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
pytorch中的inference使用实例
Feb 20 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
Django web自定义通用权限控制实现方法
Nov 24 Python
python中@contextmanager实例用法
Feb 07 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
Mar 03 Python
如何在Python项目中引入日志
May 31 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设计模式 Mediator (中介者模式)
2011/06/26 PHP
PHP中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
php解析字符串里所有URL地址的方法
2015/04/03 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
彻底搞懂PHP 变量结构体
2017/10/11 PHP
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
2015/09/09 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
Vue.js 2.0 移动端拍照压缩图片上传预览功能
2017/03/06 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
前端面试知识点目录一览
2019/04/15 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
python解决字符串倒序输出的问题
2018/06/25 Python
利用python打开摄像头及颜色检测方法
2018/08/03 Python
python3.7调试的实例方法
2020/07/21 Python
python 写一个水果忍者游戏
2021/01/13 Python
Python中的面向接口编程示例详解
2021/01/17 Python
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
空指针到底是什么
2012/08/07 面试题
营业经理岗位职责
2013/11/10 职场文书
会计专业自我鉴定范文
2013/12/29 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
实施意见格式范本
2015/06/05 职场文书
新闻稿件写作技巧
2015/07/18 职场文书
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android