汉诺塔问题 递归

  • 格式:doc
  • 大小:29.50 KB
  • 文档页数:3

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目描述Description

汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题。在A,B,C 三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔。

游戏中的每一步规则如下:

1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方)

2. 移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小的盘子)

如对于n=3的情况,一个合法的移动序列式:

1 from A to C

2 from A to B

1 from C to B

3 from A to C

1 from B to A

2 from B to C

1 from A to C

给出一个数n,求出最少步数的移动序列

输入描述Input Description

一个整数n

输出描述Output Description

第一行一个整数k,代表是最少的移动步数。

接下来k行,每行一句话,N from X to Y,表示把N号盘从X柱移动到Y 柱。X,Y属于{A,B,C}

样例输入Sample Input

3

样例输出Sample Output

7

1 from A to C

2 from A to B

1 from C to B

3 from A to C

1 from B to A

2 from B to C

1 from A to C

数据范围及提示Data Size & Hint

n<=10

#include

#include

//a为起始柱,b为临时住,c为终点柱

void hannuo(int n,char a,char b,char c)

{

if(n==1) printf("%d from %c to %c\n",n,a,c);//单独处理n=1,移向终点柱

else

{

hannuo(n-1,a,c,b);//将上方n-1个移向临时柱

printf("%d from %c to %c\n",n,a,c); //将第n个柱子移向终点柱

hannuo(n-1,b,a,c); //将n-1个柱子移向终点柱

}

}

int main()

{

int n;

scanf("%d",&n);

printf("%d\n",(int)pow(2,n)-1);//步数为2的n次方-1 hannuo(n,'A','B','C');

return 0; }