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 相关文章推荐
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
Python实现的弹球小游戏示例
Aug 01 Python
Python3.6使用tesseract-ocr的正确方法
Oct 17 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
Jan 23 Python
python 定时任务去检测服务器端口是否通的实例
Jan 26 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
May 28 Python
django框架两个使用模板实例
Dec 11 Python
python图形开发GUI库wxpython使用方法详解
Feb 14 Python
Python模块相关知识点小结
Mar 09 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
Jun 18 Python
Django xadmin安装及使用详解
Oct 26 Python
python 爬虫爬取京东ps4售卖情况
Dec 18 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编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
基于JQuery及AJAX实现名人名言随机生成器
2017/02/10 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
python批量提交沙箱问题实例
2014/10/08 Python
Python入门篇之数字
2014/10/20 Python
用python 制作图片转pdf工具
2015/01/30 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
Python3实现取图片中特定的像素替换指定的颜色示例
2019/01/24 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
Python中用xlwt制作表格实例讲解
2020/11/05 Python
HTML5使用DOM进行自定义控制示例代码
2013/06/08 HTML / CSS
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
Ever New加拿大官网:彰显女性美
2018/10/05 全球购物
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
网上快餐厅创业计划书
2014/02/01 职场文书
办公室岗位职责
2014/02/12 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
金榜题名主持词
2015/07/02 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
2019大学生实习报告
2019/06/21 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
Pyhton模块和包相关知识总结
2021/05/12 Python
Java中生成微信小程序太阳码的实现方案
2022/06/01 Java/Android