1. 程式人生 > >【演算法】漢諾塔問題 Hanoi Tower

【演算法】漢諾塔問題 Hanoi Tower

題目內容    漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

輸入盤子的數量n,求多少步能搬完。

經驗值:最少步數:2^n - 1

樣例輸入

3

樣例輸出

7

//C語言求移動次數的遞迴函式 
include<stdio.h>
int h(int m)
{
    int s;
    if(m==1)      // 確定初始條件
        s=1;
    else
        s=2*h(m-1)+1;
    return s;
}
int main()
{   
    int n;
    scanf("%d",&n);
    printf("%ld",h(n));
}

提示“請輸入盤子數:”,輸入盤子的數量n,列印移動過程,並輸出“總共移動了n次”。

//C++
#include<iostream>
using namespace std;
int s=0;
void move(char m,char n)
{
    cout<<m<<" → "<<n<<endl;
    s++;
}
void hanoi(int n,char a,char b,char c)
{ 
    if(n==1)
    { 
        move(a,c);
    }
    else
    {
        hanoi(n-1,a,c,b);//藉助c將n-1個盤子從a移動到b 
        move(a,c);
        hanoi(n-1,b,a,c);//藉助a將n-1個盤子從b移動到c 
    }
}
int main()
{
    int n;
    cout<<"請輸入盤子數:";
    cin>>n;
    cout<<"移動"<<n<<"個盤子的過程:"<<endl;
    hanoi(n,'A','B','C') ;
    cout<<"總共移動了"<<s<<"次"; 
    return 0;
 } 
using namespace std;
int hannuota(int n, string a, string b, string c)
{
	if (n == 1)
	{
		//只有一個盤子的情況下直接將第一個塔上的盤子移動到第三個塔
		printf("%d from %s to %s\n", n,a.c_str(), c.c_str());
	}
	else {
		//1.先將第一個塔的n-1個盤子全部通過第三個塔移動到第二個塔上
		hannuota(n - 1, a, c, b);
		//2.再將剩下的一個盤子移動到第三個塔上
		printf("%d from %s to %s\n",n, a.c_str(), c.c_str());
		//3.最後將第二個塔上的盤子通過第一個塔移動到第三個塔上
		hannuota(n - 1, b, a, c);
	}
	return 1;
}

int main(int argc, const char * argv[]) {
	int n;
	scanf("%d", &n);
	hannuota(n, "A", "B", "C");
	system("pause");
	return 0;
}