题目
题目分析
- 为了找到满足条件的放置方法,可以带入总盘数为2和3的情景,用递归做法实现。
2.== A中存在1 2两个盘,为了实现最少次数放入C且上小下大,先将1放入B,再将2放入C,最后将1放入C即可。同理当A中存在1 2 3 三个盘时,可将1 2盘看成整体,再理解整个过程可以发现,把N个圆盘的问题递归成N-1个圆盘的问题即可。==
题解1(递归)
def hanio(x,y,z,n):
global sum
if (n==1):
sum+=1
if(sum==m):
print(f"#{n}: {x}->{z}")
else:
hanio(x,z,y,n-1)
sum+=1
if sum==m:
print(f"#{n}: {x}->{z}")
hanio(y,x,z,n-1)
n,m=map(int,input().split())
sum=0
hanio('A','B','C',n)
print(sum)
题解2(栈)
- 利用栈实现。
st = [[0 for i in range(30000)] for i in range(4)]
sum,m = 0,0
def move(x, y, n):
global sum,m
element = st[x].pop()
st[y].append(element)
sum +=1
a,b ='',''
if x==1: a='A'
if x==2: a='B'
if x==3: a='C'
if y==1: b='A'
if y==2: b='B'
if y==3: b='C'
if sum == m: print('#',n,': ',a,"->",b, sep="")
def hanoi(n,x, y, z):
if (n == 1): move(x,z,n)
else:
hanoi(n-1,x, z, y)
move(x,z,n)
hanoi(n-1,y, x, z)
n, m = map(int, input().split())
for i in range(n): st[1].append(i)
hanoi(n,1,2,3)
print(sum)