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提取页面内url列表的方法
May 25 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
Django 多语言教程的实现(i18n)
Jul 07 Python
padas 生成excel 增加sheet表的实例
Dec 11 Python
Python Tkinter Entry和Text的添加与使用详解
Mar 04 Python
python输出第n个默尼森数的实现示例
Mar 08 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
Mar 30 Python
如何在python中执行另一个py文件
Apr 30 Python
python简单实现9宫格图片实例
Sep 03 Python
Python存储读取HDF5文件代码解析
Nov 25 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 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连接oracle数据库的核心步骤
2016/05/26 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
2019/03/27 PHP
jQuery技巧总结
2011/01/01 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
Google 地图API资料整理及详细介绍
2016/08/06 Javascript
关于Vue.js一些问题和思考学习笔记(1)
2016/12/02 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
Vue 单文件中的数据传递示例
2017/03/21 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
详解vue 数据传递的方法
2018/04/19 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
python发送arp欺骗攻击代码分析
2014/01/16 Python
Python实现的石头剪子布代码分享
2014/08/22 Python
使用C++扩展Python的功能详解
2018/01/12 Python
浅谈Django的缓存机制
2018/08/23 Python
Python中如何使用if语句处理列表实例代码
2019/02/24 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
英国最受欢迎的平价女士时装零售商:Roman Originals
2019/11/02 全球购物
美国宠物护理专家:Revival Animal Health
2020/01/05 全球购物
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
销售业务实习自我鉴定
2013/09/23 职场文书
音乐表演专业毕业生求职信
2013/10/14 职场文书
《长城》教学反思
2014/02/14 职场文书
律师授权委托书范本
2014/10/07 职场文书
活动简报范文
2015/07/22 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL