天天看點

HDU 2064 漢諾塔III【找規律】漢諾塔III

漢諾塔III

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11976 Accepted Submission(s): 5473

Problem Description 約19世紀末,在歐州的商店中出售一種智力玩具,在一塊銅闆上有三根杆,最左邊的杆上自上而下、由小到大順序串着由64個圓盤構成的塔。目的是将最左邊杆上的盤全部移到右邊的杆上,條件是一次隻能移動一個盤,且不允許大盤放在小盤的上面。

現在我們改變遊戲的玩法,不允許直接從最左(右)邊移到最右(左)邊(每次移動一定是移到中間杆或從中間移出),也不允許大盤放到下盤的上面。

Daisy已經做過原來的漢諾塔問題和漢諾塔II,但碰到這個問題時,她想了很久都不能解決,現在請你幫助她。現在有N個圓盤,她至少多少次移動才能把這些圓盤從最左邊移到最右邊?

Input 包含多組資料,每次輸入一個N值(1<=N=35)。

Output 對于每組資料,輸出移動最小的次數。

Sample Input

1
3
12
        

Sample Output

2
26
531440
        

這個題和平常的漢諾塔沒什麼差別,隻是加了限制條件,然後不能直接移動,原先兩步移動完成的任務,現在需要三步完成,公式由 2 的 n 次方減一 ,變成了 3 的n次方 減一,就這樣..........

#include<stdio.h>
long long x[36];
void db()
{
	x[0]=1;
	for(int i=1;i<36;++i)
	{
		x[i]=x[i-1]*3;
	}
}
int main()
{
	int n;db();
	while(~scanf("%d",&n))
	{
		printf("%lld\n",x[n]-1);
	}
	return 0;
}
           

再次見到這個題,用快速幂溫習一下........

/*
2016年1月15日 17:19 
*/
#include<stdio.h>
long long qm(int n,int m)
{
	long long s=1,x=n;
	while(m)
	{
		if(m&1)
		{
			s*=x;
		}
		x*=x;
		m>>=1;
	}
	return s;
}
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		printf("%lld\n",qm(3,n)-1);
	}
	return 0;
}