码迷,mamicode.com
首页 > 其他好文 > 详细

Hanoi汉诺塔问题

时间:2015-05-01 00:35:10      阅读:357      评论:0      收藏:0      [点我收藏+]

标签:

题目描述 Description

有N个圆盘,依半径大小(半径都不同),自下而上套在A柱上,每次只允许移动最上面一个盘子到另外的柱子上去(除A柱外,还有B柱和C柱,开始时这两个柱子上无盘子),但绝不允许发生柱子上出现大盘子在上,小盘子在下的情况,现要求设计将A柱子上N个盘子搬移到C柱去的方法。 

输入输出格式 Input/output
输入格式:
一行,n<=20
输出格式:
步数及各种圆盘要移动的步骤
输入输出样例 Sample input/output
样例测试点#1
输入样例:
2
输出样例:
1:From A to B
2:From A to C
3:From B to C
样例测试点#2
输入样例:
3
输出样例:
1:From A to C
2:From A to B
3:From C to B
4:From A to C
5:From B to A
6:From B to C
7:From A to 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

 

Hanoi汉诺塔问题

标签:

原文地址:http://www.cnblogs.com/geek-007/p/4470075.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!