小可爱~ 发表于 2016-10-24 12:00

[C语言][笔记]对汉诺塔的理解

本帖最后由 小可爱~ 于 2016-10-24 12:01 编辑

有理解错误的地方请见谅并指出错误
#define_CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//汉诺塔
//最终目的:a --> c
static int flag = 0;
void printH(char a, char c)
{
      flag++;
      printf("%d:%c->%c\n", flag, a, c);
}

void hanoi(char a, char b, char c, int num)
{
      if (1 == num)
      {
                printH(a, c);
      }
      else
      {
                //将 a 上的盘子 借助 c 移动到 b
                hanoi(a, c, b, num - 1);
                //这个函数很好理解
                //当盘子只有一个的时候直接从 a 移动到 c-
                //当盘子多个的时候(假设两个), 看 (1) hanoi(a, c, b, num - 1); 这个调用
                //这个时候 (2) void hanoi(char a, char b, char c, int num)
                //这上面的 a 对应 (1) 总的 a
                //(2)的b对应(1)c
                //(2)的c对应(1)b
                //此时的 a -- ab -- cc -- b
                //函数printH(a, c);a --> c
                //实质上是 a 移动到 b
                //printf 显示出来的 是A->B此时 num = 1;
                //这个时候再次调用 hanoi(a, c, b, num - 1);
                //就变成了
                // a -- a
                // b -- b
                // c -- c
                //此时调用 printH(a, c); 就变成了 a->c字符显示'A'->'C';
                printH(a, c);
                //将 b 上的盘子 借助 a 移动到 c
                //同理
                // b -> c
                hanoi(b, a, c, num - 1);
      }
      
}

int main(int argc, char *argv[])
{
      int ret = 0;
      char a = 'A';
      char b = 'B';
      char c = 'C';
      int num = 0;

      
      puts("请问需要几个碟子:");
      scanf("%d", &num);

      hanoi(a, b, c, num);
      
      system("pause");
      return ret;
}

裴冰夏 发表于 2016-10-24 12:45

经典算法

LeiSir 发表于 2016-10-24 12:49

在学习谢谢分享。

ykbest 发表于 2016-10-24 13:01

简单明了   谢谢分析学习了

longhai001 发表于 2016-10-24 18:42

很好,很经典的算法

沐雨红尘 发表于 2016-10-24 19:00

Zero丶冻结 发表于 2016-10-24 21:07

楼主厉害,虽然我不懂C

11212122 发表于 2016-10-24 21:21

主要就是练递归的,

19876 发表于 2016-10-24 21:30

楼主厉害,支持
页: [1]
查看完整版本: [C语言][笔记]对汉诺塔的理解