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中几种导入模块的方式总结
Apr 27 Python
Python爬虫之模拟知乎登录的方法教程
May 25 Python
tensorflow实现对图片的读取的示例代码
Feb 12 Python
Python实现对文件进行单词划分并去重排序操作示例
Jul 10 Python
python实现Virginia无密钥解密
Mar 20 Python
Python3模拟curl发送post请求操作示例
May 03 Python
python 实现图片上传接口开发 并生成可以访问的图片url
Dec 18 Python
python使用python-pptx删除ppt某页实例
Feb 14 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 Python
python实现简单学生信息管理系统
Apr 09 Python
python 实现朴素贝叶斯算法的示例
Sep 30 Python
Pytorch可视化的几种实现方法
Jun 10 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安全配置
2006/10/09 PHP
用定制的PHP应用程序来获取Web服务器的状态信息
2006/10/09 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
2015/02/02 PHP
php轻松实现文件上传功能
2016/03/03 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
js判断60秒以及倒计时示例代码
2014/01/24 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
2017/04/13 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
JS实现数组的增删改查操作示例
2018/08/29 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
vue-router 中 meta的用法详解
2019/11/01 Javascript
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
python通过线程实现定时器timer的方法
2015/03/16 Python
在Django的通用视图中处理Context的方法
2015/07/21 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
python中的字符串内部换行方法
2018/07/19 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
python3.8.1+selenium实现登录滑块验证功能
2020/05/22 Python
python 基于opencv实现图像增强
2020/12/23 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
原生 JS+CSS+HTML 实现时序图的方法
2019/07/31 HTML / CSS
英国健身仓库:Bodybuilding Warehouse
2019/03/06 全球购物
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
腾讯技术类校园招聘笔试试题
2014/05/06 面试题