递归求解汉诺塔问题(C++)

递归求解汉诺塔问题(C++)

【问题描述】
Hanoi(汉诺)塔问题。这是一个经典的数学问题:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64 个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在E移动过程中可以利用B座,要求编写程序打印出若只有n个盘子时移动的步骤。

【问题分析】
1.假设最开始A座上有n个盘子,如果我们能够将最下面的盘子通过B座移到C座上,则我们只需要再把A座上的n-1个盘子全部挪到C座即可。
2.要将最下面的盘子移到C座上,则必须先将上边的n-1个盘子通过C座挪到B座上,再把最大的盘子直接挪到C座即可。
3.然后再将B座上的n-1个盘子通过A座挪到C座上即可,这样就实现了一个递归。

【代码实现】

#include <iostream>
using namespace std;
int main()
{
    
    
	void hnt(int n,char a,char b,char c);
	int num;
	char a,b,c;
	a='A';
	b='B';
	c='C'; 
	cin>>num;
	hnt(num,a,b,c);
	return 0;
}
void hnt(int n,char a,char b,char c)
{
    
    
	if(n==1) cout<<a<<"--->"<<c<<endl;
	else
	{
    
    hnt(n-1,a,c,b);
	hnt(1,a,b,c);
	hnt(n-1,b,a,c);
	}
}

若要求再对盘子进行编号,实现代码如下:

#include <iostream>
using namespace std;
void Move(int n,char x,char y)
{
    
    
   cout<<x<<"->"<<n<<"->"<<y<<endl;
}
void Hannoi(int n,char a,char c,char b)
{
    
    
	if(n==1) Move(1,a,b);
    else
    {
    
    Hannoi(n-1,a,b,c);
    Move(n,a,b);
    Hannoi(n-1,c,a,b);
    }
}
int main()
{
    
    
	int n;
	char a,b,c;
  	cin>>n>>a>>b>>c;
    Hannoi(n,a,c,b);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hyl1181/article/details/107494798