算法设计之汉诺塔求解

#汉诺塔的两种求解方式递推、递归

问题描述
算法设计之汉诺塔求解_第1张图片
移动规则:
每次只能移动一个圆盘;
圆盘可以插在A、 B和C中的任何一个塔座上;
任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。

求n层汉诺塔的移动次数

输入:n

输出:n层汉诺塔移动次数

##递推方式求解

算法分析:

设f(n)为n层汉诺塔移动次数

根据规律得到递推关系式f(n) = 2*f(n-1)+1

边界条件:f(1) = 1

递推算法代码实现:

#include 
using namespace std;
int main(){
 	int f[1000]={0,1};
 	int n;
 	cin>>n;
 	for(int i=2;i<=n;i++)
  		f[i]=2*f[i-1]+1;
 	cout<<f[n]<<endl;
 	return 0;
}

##递归方式求解

算法代码实现

#include 
using namespace std;

void move(char from,char to){                        //移动路径
	cout<<"Move"<<from<<"-->"<<to<<endl;
}

void hanoi(int n,char first,char second,char third){  //移动递归	
	if(n==1){
		move(first,third);
    	}else{
        	hanoi(n-1,first,third,second);
        	move(first,third);
        	hanoi(n-1,second,first,third);
    	}
}

int main()
{
 	int n; 
 	cout<<"请输入汉诺塔的层数n:";
 	cin>>n;
    	hanoi(n,'A','B','C');
    	return 0;
}

你可能感兴趣的:(算法设计之汉诺塔求解)