汉诺塔问题
最近学到一个关于汉诺塔问题的算法,然而发现对汉诺塔问题的了解还不够,故温故而知新。
汉诺塔问题:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘,大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上,并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
假设有三根石柱子分别为:A, B, C,在柱子A上有n个圆盘,需要按照汉诺塔问题的规则移动到柱子C上。
算法思想:
(1)将柱子A上的前n-1个圆盘移动到柱子B上;
(2)将柱子A上的第n个圆盘移动到柱子C上;
(3)将柱子B上的n-1个圆盘移动到柱子C上。
汉诺塔问题的求解需要用到递归思想:所谓递归,就是一个函数直接或间接地调用其自身,直到遇到某个条件则结束该调用过程,这个条件可称为结束条件或退出条件,如果退出条件设置的不合理则该函数会陷入死循环。
核心代码:
1 void move(int n, char a, char b, char c) 2 { 3 if(n == 1) 4 { 5 printf("%c --> %c\n", a, c); 6 } 7 else 8 { 9 move(n - 1, a, c, b); //将前n-1个圆盘从柱a移动到柱b 10 printf("%c --> %c\n", a, c); //将第n个圆盘从柱a移动到柱c 11 move(n -1, b, a, c); //将柱b中的n-1个圆盘从柱b移动到柱c 12 } 13 }