1. 程式人生 > >C / C++ 漢諾塔移動路線和移動次數問題

C / C++ 漢諾塔移動路線和移動次數問題

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

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次”。
樣例輸入

3

樣例輸出

移動3個盤子的過程:
A → C
A → B
C → B
A → C
B → A
B → C
A → C
總共移動了7次

//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; }

解析:

1個圓盤的時候 2的1次方減1     2個圓盤的時候 2的2次方減1
3個圓盤的時候 2的3次方減1     4個圓盤的時候 2的4次方減1
5個圓盤的時候 2的5次方減1
…………
n個圓盤的時候 2的n次方減1

H(1)=1H_{(1)} = 1
H(n)=2n1(n&gt;0)=2Hn1+1(n&gt;1)H_{(n)} = 2^n - 1 (n&gt;0)\\   = 2*H_{(n-1)}+1 (n&gt;1)