*汉诺塔问题可以分解为两种情况
1,a上只有一个木块:只需将a->c。
{
if(n==1)
cout<<a<<"->"<<c<<endl;
}
2,a上有n个木块:汉诺塔既然是递归问题,递归问题一般都是从最后一步分析往前分析。
首先,如何搬运最后一块n?
那么需要把n上的n-1块从a上搬运到中间b上,
然后把第n块从a搬运到c上,
最后把b上的n-1块再搬运到c上即可。
(可能有些同学会疑惑,汉诺塔每次只能移动一个木块,如何将n-1块从a搬运到b呢,这就是递归,只需调运你之前根据规律编写的汉诺塔函数,就能完成。你只需要把原来的中间b看成你要搬运到最终点的c,c反而起到了原本b过度的作用(b与c互换即可 :hlt(n-1,a,c,b);同理,把n-1块从b再搬运到a是一样的)
#include <iostream>
using namespace std;
void hlt(int n,char a,char b,char c)
{
if(n==1)
{cout<<a<<"->"<<c<<endl;
return;}
hlt(n-1,a,c,b);//那么需要把n上的n-1块从a上搬运到中间b上,
cout<<a<<"->"<<c<<endl;//然后把第n块从a搬运到c上,
hlt(n-1,b,a,c);//最后把b上的n-1块再搬运到c上即可。
return ;
}
int main()
{
int n;
cin>>n;
hlt(n,'a','b','c');
return 0;
}
各位朋友大家好,第一次写博客,有点小激动,身为萌新经常上CSDN看各位大佬写的博客,觉得它可以记录自己成长,分享自己对问题的理解,总之对自己很有帮助。希望能和大家一起成长。