汉诺塔问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zuiziyoudexiao/article/details/79945898
  • 汉诺塔问题的处理是经典的递归思想
  • 递归的两大过程是回溯和递推,首先将一个n规模的复杂问题转化成n-1规模,一步一步直到简化为一个具体的结果,再通过这个具体结果和递推关系依次向外递推,最终解决所有问题。
  • 一个老和尚想把A座的64个盘子移动到C座上,但每次只能移动一个盘子。移动过程中可以利用B座。
  • 此问题可以分解为:老和尚让另外一个和尚把上面63个盘子移动到B座,自己把第64个盘子放到C座,再让这个和尚把B座的63个盘子移动到C座。同样,第二个和尚自己移动第63个盘子,把上面的62个盘子的移动交给第三个和尚。依次类推,直到最后一个和尚得到一个明确的步骤。
  • 这个方法,就相当于把一个n规模的问题转化为两个n-1规模的问题和一个1规模的问题,同样再把n-1规模的问题简化为两个n-2规模的问题和一个1规模的问题,一直到所有的问题都是1规模的。类似于下图的过程。
    这里写图片描述
  • c语言代码如下:
#include<stdio.h>
int p = 0;
int main()
{
  int n;
  char a='a',b='b',c='c';
  int hannuo(char a,char b,char c,int n);
  printf("输入盘子的个数n:");
  scanf("%d",&n);
  hannuo(a,b,c,n);
}

int hannuo(char a,char b,char c,int n)
{
 int move(char x,char y);
 if(n==1){
      move(a,c);
     }
  else{
      hannuo(a,c,b,n-1);
      move(a,c);
      hannuo(b,a,c,n-1);
     }
}

int move(char x,char y)
{
  printf("第%d步:%c-->%c\n",++p,x,y);
}
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页