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中的strftime()方法的使用
May 22 Python
解决python写入mysql中datetime类型遇到的问题
Jun 21 Python
Python使用matplotlib绘制随机漫步图
Aug 27 Python
django解决跨域请求的问题
Nov 11 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 Python
在PyCharm下使用 ipython 交互式编程的方法
Jan 17 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 Python
解析Python 偏函数用法全方位实现
Jun 26 Python
关于django python manage.py startapp 应用名出错异常原因解析
Dec 15 Python
matplotlib阶梯图的实现(step())
Mar 02 Python
Python中的程序流程控制语句
Feb 24 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
php split汉字
2009/06/05 PHP
PHP数据库调用类调用实例(详细注释)
2012/07/12 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
JS获取地址栏参数的几种方法小结
2014/02/28 Javascript
jQuery中;function($,undefined) 前面的分号的用处
2014/12/17 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
2016/08/01 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
python绘图方法实例入门
2015/05/19 Python
Python设计模式之门面模式简单示例
2018/01/09 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
2020/03/19 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
高中自我评价分享
2013/12/05 职场文书
村干部培训班主持词
2014/03/28 职场文书
节能宣传周活动总结
2014/05/08 职场文书
房地产活动策划方案
2014/05/14 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
卖房授权委托书样本
2014/10/05 职场文书
成都人事代理协议书
2014/10/25 职场文书
给上级领导的感谢信
2015/01/22 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
Python离线安装openpyxl模块的步骤
2021/03/30 Python
python实现A*寻路算法
2021/06/13 Python
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS