从品牌网站建设到网络营销策划,从策略到执行的一站式服务
仔细看一下 5-7行调用 move 时候的参数顺序, 不是你说的那样没有变:
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:做网站、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的头屯河网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
#5 的含义是将 A 上的前 n-1 个移动到 B
#6 : 将 A 最后一个移动到 C
#7: 将 B 上的 n-1 (即#5 从 A 移动过来的 n-1) 个移动到 C
这是个递归问题。主函数很简单,不说了,关键是那个递归函数:这里有四个参数,第一个表示移动的盘子个数,这里可以通过键盘来输入。(全部移动64个盘子需要的时间很长,千万不要输入太大的数。)
x,y,z表示三根柱子。
注意参数中X,Y,Z的顺序,x表示原来的柱子,y表示在移动过程中中间过度的柱子,而z标志最后放置的柱子。下面的调用和这个次序有很大关系。
move(int n,int x,int y,int z)
{
if(n==1)
printf("%c--%c\n",x,z);
这个最简单,如果只有一个盘子(n=1),那么只要从x柱子直接移动到z柱子就可以了。不需要中间以哦的那个其他的盘子。
如果要移动的盘子不止一个,那么就要采取一定的策略。这个策略就是先把上面的n-1个盘子移动到中间的柱子,也就是y,然后把最地下一个盘子移动到z柱子,然后再把中间柱子y上的盘子通过哦a柱子移动到z柱子上。
else
{
move(n-1,x,z,y);//把上面的n-1个盘子通过z柱子移动到y柱子上,这样才能把最后一个盘子移动到z柱子上。
printf("%c--%c\n",x,z); //输出这次移动
move(n-1,y,x,z); //然后再把刚才移动出来放在y柱子上的n-1个盘子移动到z柱子上。
}
}
汉诺塔
#include stdio.h
int yd(char a,char b,char c,int n)
{
static int t=0;
if (n==2)
{
printf("%c-%c\n%c-%c\n%c-%c\n",a,c,a,b,c,b);
t=t+3;
}
else
{
yd(a,c,b,n-1);
printf("%c-%c\n",a,b);
t++;
yd(c,b,a,n-1);
}
return t;
}
main()
{
int n;
scanf("%d",n);
printf("%d",yd('a','b','c',n));
}
a.b.c是三个塔,运行后输入a塔上初始的块数。
move(n, A, B) 就表示把第n个饼从A柱移到B柱, 其中step是个全局变量,用来记录移动的次数。
hanoi(n, A, B, C) 就是你所问的实现递归的函数, 表示把n个饼从A柱通过B柱移到C柱。
其中 n==1 是递归的最基本的情况, 如果只有一个饼就直接移到目标柱子即可。
不然呢我们就先把最上面n-1个饼从A通过C移到B,注意这里移到的是B柱哦~, 然后把第n块饼移到C柱,再重新把之前移到B柱上的n-1个饼通过A移动到C。
整个过程挺直白的,想通了就明白了
成都网站建设公司地址:成都市青羊区太升南路288号锦天国际A座10层 建设咨询028-86922220
成都快上网科技有限公司-四川网站建设设计公司 | 蜀ICP备19037934号 Copyright 2020,ALL Rights Reserved cdkjz.cn | 成都网站建设 | © Copyright 2020版权所有.
专家团队为您提供成都网站建设,成都网站设计,成都品牌网站设计,成都营销型网站制作等服务,成都建网站就找快上网! | 成都网站建设哪家好? | 网站建设地图