python实现汉诺塔算法


Posted in Python onMarch 01, 2021

题目:

汉诺塔给出最优解,如果对汉诺塔的定义有不了解,请翻看数据结构教材。

除了最基本的之外,还有一题,给定一个数组,arr=[2,3,1,2,3],其含义是这是一个有5个圆盘的汉诺塔,每一个数字代表这个圆盘所在的位置,1代表左边的柱子,2代表中间,3代表右边。给出这个序列代表了汉诺塔移动的第几步,如果该步骤是错误的,则返回-1,所谓错误,是指该步骤不是最简便的得到汉诺塔序列的操作步骤。

分析:

1、 算法当然还是递归解了,即把n个汉诺塔盘子分解成 n - 1 个盘子的移动和一个底层盘子的移动,这样一来,问题就成了一连串的递归,然后就可以逐步求解了。
当然了,汉诺塔还有进阶问题,此处先不讨论,随后补上吧。

2、 这个步骤的循环是从最右边开始的,考察最大的圆盘,因为数组的索引值越大,其圆盘的半径越大。
这样一来,如果最大的圆盘的值为3,说明已经移动到位了,如果为1,说明还没有开始移动底层圆盘,如果为2,说明圆盘移动到了中间,表示移动错误,因为根本不需要移动到中间,这个步骤是多余的。

代码:

#!usr/bin/python2.7
# -*- coding=utf8 -*-
# @Time : 18-1-3 下午9:52
# @Author : Cecil Charlie


class Hanoi(object):
 """
 汉诺塔问题,给定三个盘子,用计算机计算出来将所有的盘子从左移动到右的所有的操作。
 """
 def __init__(self):
 self.place = ["left", "middle", "right"]
 self.num = 0 # 表示所有操作的总次数

 def hanoi(self, n):
 """
  给定一个n,即汉诺塔的盘子数量,返回所有的从左移动到右侧的具体操作步数
 :param n: 盘子数
 :return: 具体操作
 """
 self.num = 0
 if n > 0:
  self.__move(n, "left", "middle", "right")

 def __move(self, n, start, mid, end):
 if n == 1:
  print "move from " + start + " to " + end
  self.num += 1
 else:
  self.__move(n-1, start, end, mid)
  self.__move(1, start, mid, end)
  self.__move(n-1, mid, start, end)

 def step(self, arr):
 """
  求解针对arr的圆盘,所对应的最优解到底是第几步。解题的核心在于从右向左考察圆盘到底在不在3位置,如果在,则说明已经移动成功了;
  如果在中间,说明移动出现了错误,因为不需要移动到中间,如果还在左边,则仍需要考虑。
 :param arr: 列表中每一项表示该项的圆盘在哪个柱子上,取值包括1,2,3。1表示左,2表示中,3表示右,索引值越大,表示的圆盘的半径越大。
 :return: 属于最优解的第几步
 """
 if arr is None:
  return -1
 for i in xrange(len(arr) - 1):
  if arr[i] != 1 and arr[i] != 2 and arr[i] != 3:
  return -1
 return self.__process(arr, len(arr)-1, 1, 2, 3)

 def __process(self, arr, i, start, mid, end):
 """
  具体操作得到arr属于第几步
 :param arr: 圆盘对应的位置数组列表
 :param i: 考察arr圆盘的第几个,最大值是 len(arr)-1
 :return: 返回步数,如果给出的arr的位置不是移动的最优解,则返回 -1。
 """
 if i == -1:
  return 0
 if arr[i] != start and arr[i] != end:
  return -1
 if arr[i] == start:
  return self.__process(arr, i-1, start, end, mid) # 说明其值还未过半,直接找之前的就好
 else: # 说明步数已经过半了。
  count = self.__process(arr, i-1, mid, start, end)
  if count == -1:
  return -1
  return (i * 2) + count

h = Hanoi()
h.hanoi(4)
print h.num
print h.step([3,3,2,1])

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中下划线的使用方法
Mar 27 Python
python 字典(dict)按键和值排序
Jun 28 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
Jun 02 Python
Python使用三种方法实现PCA算法
Dec 12 Python
Python实现识别手写数字大纲
Jan 29 Python
django数据库migrate失败的解决方法解析
Feb 08 Python
python 实现图片旋转 上下左右 180度旋转的示例
Jan 24 Python
Flask框架工厂函数用法实例分析
May 25 Python
Python实现RGB与HSI颜色空间的互换方式
Nov 27 Python
python3爬虫中多线程进行解锁操作实例
Nov 25 Python
python绘图pyecharts+pandas的使用详解
Dec 13 Python
python运算符之与用户交互
Apr 13 Python
Python3中bytes类型转换为str类型
Sep 27 #Python
python求解数组中两个字符串的最小距离
Sep 27 #Python
Python开发的十个小贴士和技巧及长常犯错误
Sep 27 #Python
详解django中使用定时任务的方法
Sep 27 #Python
Python高级特性切片(Slice)操作详解
Sep 27 #Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 #Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 #Python
You might like
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
用box固定长宽实现图片自动轮播js代码
2014/06/09 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
pandas去重复行并分类汇总的实现方法
2019/01/29 Python
numpy.linspace函数具体使用详解
2019/05/27 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
大学生个人总结的自我评价
2013/10/05 职场文书
店长助理岗位职责
2013/12/13 职场文书
小学敬老月活动方案
2014/02/11 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
云台山导游词
2015/02/03 职场文书
2015大学迎新晚会策划书
2015/07/16 职场文书
HTML+CSS 实现顶部导航栏菜单制作
2021/06/03 HTML / CSS
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers