汉诺塔问题是递归中的经典,通过简单的递归思想解决了复杂的问题。
汉诺塔问题
古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可利用B座。
请编程序输出移动这些盘子的详细步骤。
汉诺塔问题 hanoi tower
这个问题的框架已经给你搭好了,只需要在 else 部分写三句话(3个动作,其中2个和 n-1 有关)就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> void move(char a, char b) { printf("move %c -> %c\n", a, b); } void hanoi(int n,char one,char two,char three) { if (n==1) move(one, three); else { } } int main() { hanoi(3, 'A', 'B', 'C'); return 0; } |
你一定要好好琢磨琢磨,如果能想出来,你的C语言功力会有巨大的提升哦!
下面有答案!看看和你想的是不是一样。
汉诺塔问题 hanoi tower 完整程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> void move(char a, char b) { printf("move %c -> %c\n", a, b); } void hanoi(int n,char one,char two,char three) { if (n==1) move(one, three); else { hanoi(n-1, one, three, two); move(one, three); hanoi(n-1, two, one, three); } } int main(int argc, char *argv[]) { hanoi(3, 'A', 'B', 'C'); return 0; } |