Hanoi问题以递归移动柱上碟子的方法解决问题,但各柱上碟片的变化到底是如何变化的?
下面的程序给出了演示效果,便于程序员理解。
#include <stdio.h> #define N 6 int Vals[3][N+1]; int movecnt = 0; void out() { for(int i = 0; i < 3; i++) { for(int j = 1; j <= N; j++) if (j <= Vals[i][0]) printf("%d ", Vals[i][j]); else printf(" "); printf("\t"); } printf("\n"); movecnt++; } void move(int a, int c) { int na = Vals[a][0]; int nc = Vals[c][0]; int v = Vals[a][na]; nc++; Vals[c][nc] = v; Vals[c][0] = nc; na--; Vals[a][0] = na; out(); } void hanoi(int n, int A, int B, int C) { if(n == 1) { move(A , C); } else { hanoi(n - 1 , A , C , B); move(A , C); hanoi(n - 1 , B , A , C); } } int main() { Vals[0][0] = N; Vals[1][0] = 0; Vals[2][0] = 0; for(int i = 1; i <= N; i++) Vals[0][i] = N - i + 1; printf("A\t\tB\t\tC\n"); out(); hanoi(N, 0, 1, 2); out(); printf("移动次数:%d\n", movecnt); return 0; }
程序运行结果:
A B C
6 5 4 3 2 1
6 5 4 3 2 1
6 5 4 3 1 2
6 5 4 3 2 1
6 5 4 3 2 1
6 5 4 1 3 2
6 5 4 1 3 2
6 5 4 3 2 1
6 5 3 2 1 4
6 5 3 2 4 1
6 5 2 3 4 1
6 5 2 1 3 4
6 5 2 1 4 3
6 5 2 1 4 3
6 5 1 4 3 2
6 5 4 3 2 1
6 5 4 3 2 1
6 1 5 4 3 2
6 1 5 2 4 3
6 5 2 1 4 3
6 3 5 2 1 4
6 3 5 2 4 1
6 3 2 5 4 1
6 3 2 1 5 4
6 3 2 1 5 4
6 3 2 5 4 1
6 3 5 4 1 2
6 3 5 4 2 1
6 5 4 3 2 1
6 1 5 4 3 2
6 1 5 4 3 2
6 5 4 3 2 1
5 4 3 2 1 6
5 4 3 2 6 1
2 5 4 3 6 1
2 1 5 4 3 6
2 1 5 4 6 3
2 5 4 1 6 3
5 4 1 6 3 2
5 4 6 3 2 1
4 5 6 3 2 1
4 1 5 6 3 2
4 1 5 2 6 3
4 5 2 1 6 3
4 3 5 2 1 6
4 3 5 2 6 1
4 3 2 5 6 1
4 3 2 1 5 6
4 3 2 1 6 5
4 3 2 1 6 5
4 3 1 6 5 2
4 3 6 5 2 1
4 3 6 5 2 1
4 1 3 6 5 2
4 1 3 2 6 5
4 3 2 1 6 5
3 2 1 6 5 4
3 2 6 5 4 1
2 3 6 5 4 1
2 1 3 6 5 4
2 1 6 5 4 3
2 1 6 5 4 3
1 6 5 4 3 2
6 5 4 3 2 1
6 5 4 3 2 1
移动次数:65
此外,需注意C或C++语言函数调用递归深度是有限的,且不同编译器深度不同。