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元组操作实例解析
Sep 23 Python
Python numpy 常用函数总结
Dec 07 Python
python如何将图片转换为字符图片
Aug 19 Python
numpy.random模块用法总结
May 27 Python
tensorflow 查看梯度方式
Feb 04 Python
python实现Pyecharts实现动态地图(Map、Geo)
Mar 25 Python
keras CNN卷积核可视化,热度图教程
Jun 22 Python
python开发入门——set的使用
Sep 03 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
Oct 27 Python
python 30行代码实现蚂蚁森林自动偷能量
Feb 08 Python
一文读懂python Scrapy爬虫框架
Feb 24 Python
解决Jupyter-notebook不弹出默认浏览器的问题
Mar 30 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 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
Javascript 刷新全集常用代码
2009/11/22 Javascript
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
JavaScript 数组详解
2013/10/10 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
VUE 配置vue-devtools调试工具及安装方法
2018/09/30 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
2020/02/13 Javascript
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
2017/05/24 Python
numpy自动生成数组详解
2017/12/15 Python
python中logging包的使用总结
2018/02/28 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
scrapy-redis的安装部署步骤讲解
2019/02/27 Python
Python 串口读写的实现方法
2019/06/12 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
医学专业职业生涯规划范文
2014/02/05 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
小学数学课后反思
2014/04/23 职场文书
高中生综合素质自我评价
2015/03/06 职场文书
个人年终总结怎么写
2015/03/09 职场文书
公司管理建议书
2015/09/14 职场文书
导游词之无锡唐城
2019/12/12 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
使用Python解决图表与画布的间距问题
2022/04/11 Python