内容纲要
思考:
一、Q:汉诺塔游戏的规则是什么?
A:共三个柱子,确定起始柱子上有N(自己定义)个盘子,大的盘子在下小的盘子在上,从起始柱子上挪到其他柱子上,且挪动过程不可以重复。
二、找共性。从A柱子挪动到C柱子,当我没有盘子时,就不需要操作,什么都不用挪动。当我有一个盘子时,直接从A—>C。有两个盘子时,需要先A->B,A->C,B->C。有三个盘子时,需要A->C,A->B,C->B,A->C,B->A,B->C,A->C,。有四个盘子的时候,A->B,A->C,B->C,A->B,C->A,C->B,A->B,A->C,B->C,B->A,C->A,B->C,A->N,A->C,B->C;
很复杂,所以共性是什么,从A到C挪一个盘子,挪一下A-C。挪两个盘子,挪到B一个,C一个,再把B的放到C上。挪三个,挪两个到B再挪最大的到C,再把两个挪到C。
四个,挪三个到B,挪一个到C,再把三个挪到C。
依次类推,要做的就是挪N-1个到B,然后挪一次A到C,再挪N-1次B到C,那么N-1次怎么挪呢,通过不断递归直到N==0,什么都不做。
三、关于hanoi函数,这里的是根据move函数来确定是往哪个柱子挪。
核心在于递归时参数的变化。递归都存在一个限制条件,这里的是N==1,就不再递归了而是去进入别的函数。
程序
#include<stdio.h>
void move(char from, char to) {
printf("%c to %c\n", from, to);
}
void hanoi(int n, char a, char b, char c) {
if (n == 1)
move(a, c); //由这里来设置我是从A柱挪到C柱
else {
hanoi(n - 1, a, c, b);
move(a, c);
hanoi(n - 1, b, a, c);
}
}
int main(void) {
int n;
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
}