首先是这个问题的本质:
有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; }
有时间可以对次数做一个统计,然后把方法和次说同事输出到一个文本文件里做保存