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实现查询苹果手机维修进度
Mar 16 Python
Python计算已经过去多少个周末的方法
Jul 25 Python
python如何通过protobuf实现rpc
Mar 06 Python
微信跳一跳小游戏python脚本
Jan 05 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
Python常用的json标准库
Feb 19 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
Jun 18 Python
Python序列化与反序列化pickle用法实例
Nov 11 Python
python 消费 kafka 数据教程
Dec 21 Python
解决jupyter notebook 出现In[*]的问题
Apr 13 Python
基于Python实现一个春节倒计时脚本
Jan 22 Python
python神经网络ResNet50模型
May 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 Smarty date_format [格式化时间日期]
2010/03/15 PHP
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
php UBB 解析实现代码
2011/11/27 PHP
php之CodeIgniter学习笔记
2013/06/17 PHP
PHP查询快递信息的方法
2015/03/07 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
javascript数组使用调用方法汇总
2007/12/08 Javascript
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
JavaScript CSS修改学习第六章 拖拽
2010/02/19 Javascript
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
2011/10/24 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
微信小程序前端源码逻辑和工作流
2016/09/25 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
[01:08:56]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第一场 2月7日
2021/03/11 DOTA
python 将print输出的内容保存到txt文件中
2018/07/17 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
Django REST framework内置路由用法
2019/07/26 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
什么是Remote Module
2016/06/10 面试题
医院护士的求职信
2014/01/03 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
勇敢的心观后感
2015/06/09 职场文书
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技