//汉诺塔问题
//1、2、3共三个直杆,初始时有NUMBER个盘子按照从大到小的顺序
//在1上从底向上摆放,要求将这些盘子按照次序摆放到3杆
//比如1->2表示将1上的最上面一个盘子放到2上,
//汉诺塔问题是2的n次幂级别的时间复杂度啊
//下面给出的是利用六个函数相互之间直接或者间接递归,
//如何利用一个包含有四个参数的函数实现递归???
#include <iostream>
#define NUMBER 5
using namespace std;
void H1to2(int);//将1上的所有盘子按照从大到小自底向上的顺序放到2上
void H1to3(int);//将1上的所有盘子按照从大到小自底向上的顺序放到3上
void H2to1(int);//将2上的所有盘子按照从大到小自底向上的顺序放到1上
void H2to3(int);//将2上的所有盘子按照从大到小自底向上的顺序放到3上
void H3to1(int);//将3上的所有盘子按照从大到小自底向上的顺序放到1上
void H3to2(int);//将3上的所有盘子按照从大到小自底向上的顺序放到2上
int count = 0;//记录盘子转移的次数
int main()
{
cout << NUMBER << "个盘子的汉诺塔问题解决方法如下:" << endl;
H1to3(NUMBER);
cout << "转移盘子的次数为:" << count << endl;
system("pause >> cout");
return 0;
}
//将1上的所有盘子按照从大到小自底向上的顺序放到2上
void H1to2(int n1to2)
{
if(n1to2 == 1)
{
cout << " 1 -> 2 " << endl;
count++;
}
else
{
H1to3(n1to2-1);
H1to2(1);
H3to2(n1to2-1);
}
}
//将1上的所有盘子按照从大到小自底向上的顺序放到3上
void H1to3(int n1to3)
{
if(n1to3 == 1)
{
cout << " 1 -> 3 " << endl;
count++;
}
else
{
H1to2(n1to3 - 1);
H1to3(1);
H2to3(n1to3 - 1);
}
}
//将2上的所有盘子按照从大到小自底向上的顺序放到1上
void H2to1(int n2to1)
{
if(n2to1 == 1)
{
cout << " 2 -> 1 " << endl;
count++;
}
else
{
H2to3(n2to1 - 1);
H2to1(1);
H3to1(n2to1 - 1);
}
}
//将2上的所有盘子按照从大到小自底向上的顺序放到3上
void H2to3(int n2to3)
{
if(n2to3 == 1)
{
cout << " 2 -> 3 " << endl;
count++;
}
else
{
H2to1(n2to3 - 1);
H2to3(1);
H1to3(n2to3 - 1);
}
}
//将3上的所有盘子按照从大到小自底向上的顺序放到1上
void H3to1(int n3to1)
{
if(n3to1 == 1)
{
cout << " 3 -> 1 " << endl;
count++;
}
else
{
H3to2(n3to1 - 1);
H3to1(1);
H2to1(n3to1 - 1);
}
}
//将3上的所有盘子按照从大到小自底向上的顺序放到2上
void H3to2(int n3to2)
{
if(n3to2 == 1)
{
cout << " 3 -> 2 " << endl;
count++;
}
else
{
H3to1(n3to2 - 1);
H3to2(1);
H1to2(n3to2 - 1);
}
}
这上面的就是渣呀,怎么会有这种奇葩的思维
#include <iostream>
using namespace std;
/*递归函数
从左到右的参数分别为准备移动的盘子数,最初放置这些盘子的桩
作为临时存放点的桩,最终放置这些盘子的桩*/
void hanoi(int ,char ,char ,char);
int count;//统计进行多少次的转移
int main()
{
int number;//盘子个数
cout << "请输入汉诺塔问题中的盘子个数:";
cin >> number;
hanoi(number,'A','B','C');
system("pause >> cout");
return 0;
}
//将number个盘子从a桩借助b桩转移到c桩
void hanoi(int number,char a,char b,char c)
{
if(number == 1)
cout << a << " -> " << c << endl;
else
{
hanoi(number-1,a,c,b);
cout << a << " -> " << c << endl;
hanoi(number-1,b,a,c);
}
}