将n个盘子分解成上边的n-1个和下边的1个。
这样就可以看成是两个盘子,然后再把其余过程递归。
那么对于这两个“盘子”来说,hanoi(n-1,one,three,two)是把上边的n-1个从one借助three移动到two;
再把下边的最大的盘子从one移动到three;
接着再把刚才的那堆“盘子”hanoi(n-1,two,one,three)从two借助one移动到three。
这样就移动完了,对每个大堆“盘子”一递归就把具体过程做出来了。
定义一个全局变量计数器(避免递归函数每次都把它赋成0)。程序如下:
# include<stdio.h>
void main()
{
int hanoi(int n,char one,char two,char three)
int mint j
scanf("%d",&m)
printf("%d\n",hanoi(m,'A','B','C'))
}
int j=0
int hanoi(int n,char one,char two,char three)
{
void move(char x,char y)
if(n==1)
move(one,three)
else
{hanoi(n-1,one,three,two)j++
move(one,three)
hanoi(n-1,two,one,three)j++}
return j
}
void move(char x,char y)
{
printf("%c-->%c\n",x,y)
}
将以下内容全部复制到新建的源文件中:(本人自己写的,因为你那课本上的代码,没解释,书写不规范,很难理解清楚,所以我直接新写了一个完整的代码,附带详细说明)#include <stdio.h>
//汉诺塔x层塔从A塔整体搬到C塔,中间临时B塔。
//x层塔是从大到小往上叠放。每次移动只能移动一层塔。并且在移动过程中必须保证小层在上边
//借助B塔可以将x层塔全部从A搬到C上,并且符合要求(在移动过程中大的那块在下边,小的那块在上边)
int main()
{
void tower(int x,char a,char b,char c) //声明函数
int x=5,a='A',b='B',c='C' //x表示有5层塔,具体要多少层自己修改这个值。abc分别表示ABC塔。
tower(x,a,b,c) //x层塔从a移动到c的全过程,主程序只有这条有效语句
return 0
}
//以下是tower函数的定义
//参数解析:x层塔放在a上,b是中间塔,c是目标塔。即x层塔要从a搬到c上。
//此函数实现x层塔从a整体转移到c上。以及这个过程是怎么搬的全部过程。
void tower(int x,char a,char b,char c)
{
if(x==1)printf("将%d从%c放到%c\n",x,a,c) //只有1层塔时,直接从a搬到c上。
else //不止1层塔,则先将x-1层塔从a按照规律搬到b上,再将最后一块从a搬到c上,最后再将b上的x-1层塔按照规律搬到c上。
{
tower(x-1,a,c,b) //先将x-1层塔从a按照规律搬到b上,注意参数b放在最后,因为放在最后的参数是准备搬过去的目标塔。
printf("将%d从%c放到%c\n",x,a,c) //将最后一块从a搬到c上
tower(x-1,b,a,c) //最后再将b上的x-1层塔按照规律搬到c上,注意参数b放在开头,因为x-1层是要从b上搬过去的。
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)