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 相关文章推荐
pygame学习笔记(3):运动速率、时间、事件、文字
Apr 15 Python
详细介绍Python中的偏函数
Apr 27 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
Python列表生成式与生成器操作示例
Aug 01 Python
简单了解Python matplotlib线的属性
Jun 29 Python
python匿名函数用法实例分析
Aug 03 Python
详解Python的三种拷贝方式
Feb 11 Python
Eclipse配置python默认头过程图解
Apr 26 Python
python 6行代码制作月历生成器
Sep 18 Python
Python读写csv文件流程及异常解决
Oct 20 Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 Python
Python Numpy库的超详细教程
Apr 06 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之数组学习
2011/05/29 PHP
php提示undefined index的几种解决方法
2012/05/21 PHP
destoon找回管理员密码的方法
2014/06/21 PHP
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
PHP实现提高SESSION响应速度的几种方法详解
2019/08/09 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
javascript中caller和callee详解
2015/08/10 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
Vue自定义指令封装节流函数的方法示例
2018/07/09 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
简单分析js中的this的原理
2019/08/31 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
[08:54]《一刀刀一天》之DOTA全时刻18:十九支奔赴西雅图队伍全部出炉
2014/06/04 DOTA
Python运行的17个时新手常见错误小结
2012/08/07 Python
python操作字典类型的常用方法(推荐)
2016/05/16 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
python文件读取失败怎么处理
2020/06/23 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
大学在校生求职信范文
2013/11/21 职场文书
班委竞选演讲稿
2014/04/28 职场文书
学校课外活动总结
2014/05/08 职场文书
奠基仪式策划方案
2014/05/15 职场文书
2016年会领导致辞稿
2015/07/29 职场文书
学生安全责任协议书
2016/03/22 职场文书