Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2695312
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: 高性能计算

2015-06-16 18:33:12

// ConsoleApplication4.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include


//汉诺塔:分为三步
//第一步:把A上的n-1个盘子通过C放到B上面去
//第二步:把A上面的一个盘子直接放到C上面去
//第三步:把B上面的n-1个盘子通过A放到B上面去


void hannuota(int n, char A, char B, char C)
{
if (1 == n)
{
printf("0.0将编号为%d的盘直接从%c柱子移到%c柱子\n", n, A, C);
}
else
{
hannuota(n - 1, A, C, B);
printf("0.1将编号为%d的盘直接从%c柱子移到%c柱子\n", n, A, C);
hannuota(n - 1, B, A, C);
}
}
int main(void)
{
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
int n;
printf("请输入一个盘子个数:");
scanf_s("%d", &n);
hannuota(n, ch1, ch2, ch3);


return 0;
}

http://www.cnblogs.com/ruofengzhishang/articles/1939444.html
C语言之算法初步(汉诺塔--递归算法)

  个人觉得汉诺塔这个递归算法比电子老鼠的难了一些,不过一旦理解了也还是可以的,其实网上也有很多代码,可以直接参考。记得大一开始时就做过汉诺塔的习题,但是那时代码写得很长很长,也是不理解递归的结果。现在想起来汉诺塔的算法就3个步骤:第一,把a上的n-1个盘通过c移动到b。第二,把a上的最下面的盘移到c。第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了。所以算法看起来就简单多了。不过,思考过程还是很痛苦的,难以理解。递归中会保存数据的好处在这里又得到体现,太神奇了。

汉诺塔代码如下:

#include
 
void move(int n,char a,char b,char c)
{
    if(n==1)
        printf("\t%c->%c\n",a,c);    //当n只有1个的时候直接从a移动到c
    else
    {
        move(n-1,a,c,b);            //第n-1个要从a通过c移动到b
        printf("\t%c->%c\n",a,c);
        move(n-1,b,a,c);            //n-1个移动过来之后b变开始盘,b通过a移动到c,这边很难理解
    }
}
 
main()
{
    int n;
    printf("请输入要移动的块数:");
    scanf("%d",&n);
    move(n,'a','b','c');
}

这边还找到一个ppt有助于对汉诺塔的理解,可以下载来看看

阅读(751) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~