参考论文
宁爱兵,黄明和.Hanoi塔问题非递归算法的形式推导[J].计算机工程与科学,2003(03):66-68.
具体算法
具体推导过程这里不再给出,只给出推导得到算法伪代码
C代码实现
#include <stdio.h>
#include <math.h>
int hanoiTower_iteration_math(int n, char A, char B, char C)
{
/* 三个柱子 s t d ;;; s为第一个柱子; */
char s = A;
char d, t;
int i,m,k,h;
/* 共移动(2^n-1)次 */
for(i=1; i<= pow(2,n)-1;i++)
{
k = 1; m = i;
while(m%2 == 0)
{
/* 计算第i次移动的盘号 */
k = k+1; m /=2;
}
/* k号圆盘第一次被移动的目的塔d */
if((n-k)%2 == 0) { d = C; t = B; }
else { d = B; t = C; }
/* 编号为k的圆盘第h次被移动 */
h = (m+1)/2;
switch(h % 3)
{
// i:第i次移动; k移动的盘号; 源塔->目的塔
case 0: printf("%d--%d %c - >%c\n", i, k, t, s); break;
case 1: printf("%d--%d %c - >%c\n", i, k, s, d); break;
case 2: printf("%d--%d %c - >%c\n", i, k, d, t); break;
}
}
return 1;
}
结果展示
#include <stdio.h>
int hanoiTower_iteration_math(int n, char a, char b, char c);
int main()
{
int n;
printf("please enter the number of n : ");
scanf("%d", &n);
hanoiTower_iteration_math(n, 'A', 'B', 'C');
return 1;
}