python-hanoi
1 #!/usr/bin/env python 2 #-*- coding:utf-8 -*- 3 ############################ 4 #File Name: hanoi.py 5 #Author: frank 6 #Mail: frank0903@aliyun.com 7 #Created Time:2018-04-30 09:36:13 8 ############################ 9 10 #基本思想是:先将最大的圆盘从src搬到dst 11 #如果n=1,那么直接将圆盘从src搬到dst; 12 #如果n=2,那么先将第1个圆盘从src搬到mid上,然后将第2个圆盘从src搬到dst,然后将第1个圆盘从mid搬到dst上; 13 #如果有n个圆盘,那么先将n-1个圆盘从src搬到mid上,然后将第n个圆盘从srt搬到dst, 然后将n-1个圆盘从mid搬到dst;以此类推 14 #可以这么理解,将n个圆盘抽象成"2个"圆盘,第n个圆盘当做"第2个"圆盘,另外的n-1个圆盘抽象成"第1个"圆盘,那么就可以当做是"2个"圆盘的搬运; 15 #不同层次的圆盘移动时,src,mid,dst会发生相应的变化,而不是最初第n个圆盘移动时的位置,这样就保证所有移动的准确性且不会冲突 16 #总之,抽象成"2个圆盘"的思路,并保证圆盘移动步骤的闭合性,就能确保程序的正确运行 17 count = 0 18 19 def hanoi(n, src, mid, dst): 20 global count 21 22 if n == 1: 23 ¦ print("{}:{}--->{}".format(n, src, dst)) 24 ¦ count += 1 25 else: 26 ¦ hanoi(n-1, src, dst, mid) 27 ¦ print("{}:{}--->{}".format(n, src, dst)) 28 ¦ hanoi(n-1, mid, src, dst) 29 ¦ count += 1 30 31 hanoi(3, "A", "B", "C") 32 print(count) 33 34 #n=3时,圆盘搬运的具体过程如下: 35 # 36 #hanoi(2, A, C, B) 37 # hanoi(1, A, B, C) 38 # print("{}:{}--->{}".format(1, A, C)) ==={1:A--->C} 39 # print("{}:{}--->{}".format(2, A, B)) ==={2:A--->B} 40 # hanoi(1, C, A, B) 41 # print("{}:{}--->{}".format(1, C, B)) ==={1:C--->B} 42 #print("{}:{}--->{}".format(3, A, C)) ==={3:A--->C} 43 #hanoi(2, B, A, C) 44 # hanoi(1, B, C, A) 45 # print("{}:{}--->{}".format(1, B, A)) ==={1:B--->A} 46 # print("{}:{}--->{}".format(2, B, C)) ==={2:B--->C} 47 # hanoi(1, A, B, C) 48 # print("{}:{}--->{}".format(1, A, C)) ==={1:A--->C}