输入输出样例 Sample input/output
样例测试点#1
输入样例:
标签:
题目描述 Description
有N个圆盘,依半径大小(半径都不同),自下而上套在A柱上,每次只允许移动最上面一个盘子到另外的柱子上去(除A柱外,还有B柱和C柱,开始时这两个柱子上无盘子),但绝不允许发生柱子上出现大盘子在上,小盘子在下的情况,现要求设计将A柱子上N个盘子搬移到C柱去的方法。
本题是典型的递归程序设计题。
(1)当N=1 时,只有一个盘子,只需要移动一次:A—>C;
(2)当N=2时,则需要移动三次:
A------ 1 ------> B, A ------ 2 ------> C, B ------ 1------> C.
(3)如果N=3,则具体移动步骤为:
假设把第3步,第4步,第7步抽出来就相当于N=2的情况(把上面2片捆在一起,视为一片):
所以可按“N=2”的移动步骤设计:
①如果N=0,则退出,即结束程序;否则继续往下执行;
②用C柱作为协助过渡,将A柱上的(N-1)片移到B柱上,调用过程mov(n-1, a,b,c);
③将A柱上剩下的一片直接移到C柱上;
④用A柱作为协助过渡,将B柱上的(N-1)移到C柱上,调用过程mov (n-1,b,c,a)
代码如下:
1 #include <stdio.h> 2 int k=0; 3 void Hanoi(int n,char a,char b,char c) 4 { 5 k++; 6 if(n==0)//0的话,没什么好玩的了,直接退出!! 7 { 8 return ; 9 } 10 else 11 { 12 Hanoi(n-1,a,c,b); 13 printf("%d:From %c to %c\n"k,a,c); 14 Hanoi(n-1,b,a,c); 15 } 16 } 17 int main() 18 { 19 int n; 20 scanf("%d",&n); 21 Hanoi(n,‘A‘,‘B‘,‘C‘); 22 return 0; 23 }
为了帮助同学们更好理解这个问题的递归算法,可以去下载一个PPT,这个很详细的:http://yunpan.cn/cjjutfERXMbXm 访问密码:6712
标签:
原文地址:http://www.cnblogs.com/geek-007/p/4470075.html