2020牛客寒假算法基础集训营3 I.牛牛的汉诺塔

2020牛客寒假算法基础集训营3 I.牛牛的汉诺塔

题目描述

汉诺塔是一个经典问题,相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置n个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

汉诺塔以及其衍生问题往往使用递归来求解,也是学习和理解递归很好的老师。

其伪代码如下

Function Hanoi(n,a,b,c)
    if n==1 then
        print(a+'->'+c)
    else
        Hanoi(n-1,a,c,b)
        print(a+'->'+c)
        Hanoi(n-1,b,a,c)
    end if
end Function 

牛牛很快就理解了代码的意思并且写出了求解汉诺塔的程序,他现在想研究汉诺塔的规律。
请你统计以下信息:A->B,A->C,B->A,B->C,C->A,C->B的次数,以及所有移动的总步数。

输入描述:

仅一行,输入一个正整数n(1≤n≤60)表示汉诺塔的层数。

输出描述:

首先输出6行
A->B:XX
A->C:XX
B->A:XX
B->C:XX
C->A:XX
C->B:XX
分别表示每种移动情况出现的次数
最后输出一行
SUM:XX
表示所有移动情况的总和。

示例1

输入

3

输出

A->B:1
A->C:3
B->A:1
B->C:1
C->A:0
C->B:1
SUM:7

我是找规律的,可以利用递归找n较小时的分布,不难发现A->B和B->C答案一样,B->A和C->B答案一样,这样只需找四个规律即可,python代码如下:

n=int(input())
ans=2**n-1
if n==0:
    print("A->B:",0,sep='')
else:
    m=(n-2)//2
    print("A->B:",(3*m+1+2**(2*m+3))//9,sep='')
if n%2==0:
    m=(n-1)//2
else:
    m=n//2
print("A->C:", (4**(m+1)+6*m+5) // 9, sep='')
if n==1 or n==2:
    print("B->A:",0,sep='')
else:
    if n%2:
        m=n//2
    else:
        m=(n-1)//2
    print("B->A:",(4**(m+1)-3*m-4)//9,sep='')
if n==0:
    print("B->C:",0,sep='')
else:
    m=(n-2)//2
    print("B->C:",(3*m+1+2**(2*m+3))//9,sep='')
if n==0:
    print("C->A:",0,sep='')
else:
    m=(n-2)//2
    print("C->A:",2*(4**(m+1)-3*m-4)//9,sep='')
if n==1 or n==2:
    print("C->B:",0,sep='')
else:
    if n % 2:
        m = n // 2
    else:
        m = (n - 1) // 2
    print("C->B:",(4**(m+1)-3*m-4)//9,sep='')
print("SUM:",ans,sep='')
发布了288 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43765333/article/details/104231572