首先是这个问题的本质:
有A、B、C三根柱子。A上堆放了n个盘子,按照从上到下盘子由小到大的顺序放置,现在要把盘子全部搬到C上去,条件是每次只能搬动一个盘子,而且任何时候大盘子不能放在小盘子上面(显然,必须用到B作为中转)。怎么搬动这些盘子,需要多少次?
分析:假如有两个(n = 2)盘子,A->B,A->C,B->C; 3次足矣
假如由三个盘子(n = 3),A->C,A->B,C->B,A->C,B->A,B->C,C->A; 8次足矣
假如有n个盘子,...................2的n次方减一足矣
上面只是个数学分析的过程,下面我们就如算法的编排。。
#include "iostream"
#include "stdlib.h"
void move(int n,char a,char b,char c)
{
if(n == 1)
{
std::cout<<"Move "<<a<<" to "<<c<<std::endl;
}
else
{
move(n-1,a,c,b);
std::cout<<"Move "<< a<<" to "<<c<<std::endl;
move(n-1,b,a,c);
}
}
int main()
{
int n;
std::cout<<"请输入盘数: ";
std::cin>>n;
move(n,'a','b','c');
return 0;
}
有时间可以对次数做一个统计,然后把方法和次说同事输出到一个文本文件里做保存