吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1327|回复: 1
收起左侧

[Python 转载] 递归解决汉诺塔问题

[复制链接]
三滑稽甲苯 发表于 2021-1-23 22:15
本帖最后由 三滑稽甲苯 于 2021-1-23 22:17 编辑

1. 汉诺塔介绍
你要将所有的盘子从TOWER 1移动到TOWER 3
你每次只能移动一个盘子。
游戏最重要的规则是大的盘子不能放在小的盘子上面!
(简介/在线游戏:http://www.hannuota.cn/)

简介

简介



2. 思路
若需要将n层塔从fr移至dst, 可化解为将n-1层移至空余的位置(记为other), 将最底下一层移至dst, 然后将other的n-1层移至dst。
根据此思路递归,即可获得结果。

思路

思路



3. 代码

代码

代码

[Python] 纯文本查看 复制代码
class Tower:
    def __init__(self, max):
        if 1 <= max <= 9: self.max = max
        else: raise ValueError('Height toooo large!')
        self.data = [[], [], []]
        self.step = 0
        self.ans = ''
        for i in range(max):
            self.data[0].append(i + 1)
            self.data[1].append(0)
            self.data[2].append(0)
    
    def show(self):
        s = ''
        for i in range(self.max):
            s += f'{self.data[0][i]}  {self.data[1][i]}  {self.data[2][i]}\n'
        s += 'a  b  c'
        return s
    
    def move(self, fr, dst):
        last1 = 0; last2 = self.max - 1
        for i in range(self.max):
            if self.data[fr][i]: last1 = i; break
        for i in range(self.max):
            if self.data[dst][i]: last2 = i; break
        if self.data[fr][last1]:
            if self.data[fr][last1] < self.data[dst][last2]:
                self.data[dst][last2 - 1] = self.data[fr][last1]
                self.data[fr][last1] = 0
                self.step += 1
                self.ans += f'{fr}->{dst}\n'
                return True
            elif last2 == self.max - 1 and self.data[dst][last2] == 0:
                self.data[dst][last2] = self.data[fr][last1]
                self.data[fr][last1] = 0
                self.step += 1
                self.ans += f'{fr}->{dst}\n'
                return True
            else: return False
        else: return False
    
    def moves(self, fr, dst, depth):
        if depth == 1:
            return self.move(fr, dst)
        else:
            flag = True
            other = 3 - fr - dst
            flag *= self.moves(fr, other, depth - 1)
            if flag: flag *= self.move(fr, dst)
            if flag: flag *= self.moves(other, dst, depth - 1)
            return flag

height = 9
test = Tower(height)
print(test.show())
if test.moves(0, 2, height):
    print(test.ans)
    print(test.show())
    print(test.step)
input('Fin.')

想修改层数把最后一段代码中2的height改为想要的层数即可(1~9)。


4. 效果

效果

效果

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

糯米君 发表于 2021-1-23 23:31
学习了大神
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 19:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表