题目
题目分析
为了找到满足条件的放置方法,可以带入总盘数为2和3的情景,用递归做法实现。 == 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 )