汉诺塔

题意:大梵天创造世界的时候做了三根柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

class Stack_jby(object):
    def __init__(self,L=None):
        if L is None:
            self.list=[]
        else:
            self.list=L
    def pop(self):
        if len(self.list)==0:
            print('栈为空,弹出操作不被允许!\n')
        value=self.list[-1]
        self.list.pop()
        return value
    #---python函数的参数的几种类型---
        # 1,正常定义的必选参数
        # 2,默认参数:func(a=1) 注意:默认参数必须指向不变对象!!!
        # 3,可变参数:func(*tuple).调用:func(1,2,3)或func(*tuple)
        # 4,关键字参数:func(**dic).func(name='jby')或func(**dic)
    def push(self,value):
        self.list.append(value)
    def check(self):
        for i in range(len(self.list)-1):
            if self.list[i]<self.list[i+1]:
                print('违反从大到小的排序规则!!!')
    def print(self):
        print(self.list)

def move(n,a,b,c):
    if n==1:
        value=a.pop()
        c.push(value)
        c.check()
    else:
        #---思路---
        #题意:将A上的数字(这里我们用数字表示圆片)移动到C上。过程中不能出现数字小的在数字大的下面,且每次只能移动一个数字。
        #显然,我们要先把A最底下的数字移动到C中,因为这个数字是最大的,确定好它的位置后,在后续移动过程中它就不要移动了。
        #因为每次只能移动一个数字,要移动A的最底下的那个数字,只能先把它上面的数字移动到B中,即move(n-1,a,c,b)
        #上一步做完了,我们就可以移动最底下的那个了,直接move(1,a,b,c)
        #按照上面的思路,再将B(这里的B相当于上几步中的A)中的数字移动到C,即move(n-1,b,a,c)
        move(n-1,a,c,b)
        move(1,a,b,c)
        move(n-1,b,a,c)

l=[5,4,3,2,1]
a=Stack_jby(l)
b=Stack_jby()
c=Stack_jby()

move(5,a,b,c)

c.print()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容