本帖最后由 我开心 于 2012-6-27 15:48 编辑
先贴代码
*************************************************************************************************
#include <stdio.h>
hanoi(int n,char a,char b,char c);
void move(char x,char y);
void main()
{
int m;
printf("please input the number");
scanf("%d",&m);
printf("
the solution:
");
hanoi(m,'A','B','C');
}
hanoi(int n,char a,char b, char c)
{
if(n==1)
{
move(a,c);
}
else
{
hanoi(n-1,a,c,b);
move(a,c);
hanoi(n-1,b,a,c);
}
}
void move(char x,char y)
{
printf(" %c->%c
",x,y);
}
令我百思不得其解的是hanoi(n-1,a,c,b);hanoi(n-1,b,a,c);两句的ac的顺序是怎样确定的,我看了下输出结果单数的时候第一次移动A->B,双数的时候第一次移动A->C,当这个n大于3的时候
进入递归调用,但是ac每次调用都会重复颠倒bc的顺序,所以会有单双数出现第一次移动不一致的结果,但是这个ac的顺序是怎么确定的呢,为什么不是ac呢,我改过程序,结果走不过去,虽然知道结果,但是不明白其中的缘由,请问哪位可以点播一下!!不胜感激
我的一点想法:其实这个程序并没有说计算多大的数,而是从最小值开始,比如2,当有两个的时候,只需要三步A->B,A->C,B->C,这样呢就可以确定第一步移动的方式,即hanoi(2-1,a,c,b),那样就确定了第一步,第二步就直接A->C,即move(a,c);剩下的一步也就顺理成章了!所以说,这个算法其实只是依据2个盘子的情况,而无需考虑更多的时候,会把人越绕越晕的!!不知道对不对,等待指教…………
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
的功能是借助B把n块按照规则移动到C
所以
if(n==1) //当n=1时,直接把A移动到C即可
{
move(a,c);
}
else //当n>1时
{
hanoi(n-1,a,c,b); //借助C先把n-1块按照规则从A移动到B
move(a,c); //此时C是空的,把第n块从A移动到C
hanoi(n-1,b,a,c); //最后借助A按照规则把n-1块从B移动到C
}
一周热门 更多>