码迷,mamicode.com
首页 > 其他好文 > 详细

Demo:Hanoi塔问题到底是如何运行的?

时间:2015-03-09 01:43:13      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:

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++语言函数调用递归深度是有限的,且不同编译器深度不同。

Demo:Hanoi塔问题到底是如何运行的?

标签:

原文地址:http://blog.csdn.net/miscclp/article/details/44144939

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!