汉罗塔问题是一个非常经典的算法,我们首先来研究一下修改的汉罗塔(简化步骤),在后面我们将来讲述经典的汉罗塔问题。
题目:
修改后的汉罗塔的规则:现在限制不能从最左侧的塔直接移动到最右侧,必需要经过中间;同时从最右侧移动到最左测试,同样必需经过中间;要求移动N层塔时,打印最优移动
1、用递归函数实现(从最左移动到最右)
分析:
- 当只有一层塔时,我们先需要将其从左移到中间,再从中间移动到右边,共分为两步;如果它就在中间,那么我们只需要将它移动到左或则右,一步就行;
- 当我们有N 层塔时,我们需要先将1~N-1层塔移动到右边,然后移动第N层塔到中间,再将1~N-1层塔移动到最左边,将N层塔由中间移动右边;这样,第N层塔就移好了
- 接下来重复上述步骤,将1~N-2层塔移到最右边,将第N-1层塔移到最中间……(利用递归函数实现)
代码实现:
void _HanoiProblem1(int num,string from,string to,int& count)//num代表塔的层数,from代表开始移动的位置(left,mid,right),to 代表要移动到的位置
{
if(num == 1)//我们只有一层塔
{
if(from.compare("mid")==0 || to.compare("mid")==0)//此时只需直接移动
{
count++;
cout<<"move "<<num<<" from "<<from.c_str()<<" to "<<to.c_str()<<endl;
}
else
{
cout<<"move "<<num<<" from "<<from.c_str()<<" to "<<