有个Hanoi(汉诺塔的问题。
Hanoi(汉诺)塔问题。用递归方解题。有三个座,分别是A,B,C。A座上有三个盘,盘大小不等。大的在下,小的在上。把这三个盘从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。
三个盘子的移动过程:
1 将A座上2个盘子移动到B座上
2 将A座上1个盘子移动到C座上
3 将B座上2个盘子移动到C座上
由上面分析可知
将A上n-1个盘借助C座先移动到B座上
将A座上剩下的一个盘移动到C座上
将n-1个盘从B座借助于A座移动到C座上
将"one"座上n-1个移到"two"座(借助“three”座)。只是在第一步和第三步中,one ,two ,three和A,B,C 对应关系不同。对第一步,对应关系是one = A ,two = B, three=C.第三步,对应关系是:one=B,two=C, three=A
可以把上面的3个步骤分成两类操作
一:将n-1个盘从一个座移动另一个座上(n>1).它是一个递归过程
二:将1个盘子从一个座上移动另一个座上。
分别用两个函数实现以上的两类操作,用hanoi函数实现上面的第一类操作,用move 函数来实现第二类操作,函数调用hanoi(n,one,two,three)表示将n个盘子从"one " 座移到“three”座的过程(借助“two”座)。函数move(x,y)表示将1个盘子从x座移动y座的过程。x 和y 是代表A,B,C座之一,根据每次不同情况分别取A,B,C代入。
源程序:
#include<stdio.h>
int main()
{
void hanoi(int n,char one,char two,char three); //对hanoi函数的说明
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("The step to move %d diskes:\n",m);
hanoi(m,'A','B','C');
}
void hanoi(int n,char one,char two,char three); //定义hanoi函数
//将n 个盘从one座借助two座,移到three 座
{
void move(char x,char y); //对move 函数的声明
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void move(char x,char y) // 定义move函数
{
printf("%c-->%c"x,y);
}
问题:
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
这几句不理解
这两句中的n-1的值是不是一样的
第一步,对应关系是one = A ,two = B, three=C.第三步,对应关系是:one=B,two=C, three=A
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
程序中的对应关系好像不对
会的请说一下,谢谢。