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

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

时间: 2024-10-03 14:46:11

Demo:Hanoi塔问题到底是如何运行的?的相关文章

栈和递归之Hanoi塔

hanoi塔 代码 <pre name="code" class="cpp">#include<stdio.h> void move(char x,int n,char y) { static int k=1; printf("Step %d : %d from %c >>->> to %c \n",k++,n,x,y); } void hanoi(int n,char A,char B,char

用递归实现 hanoi塔

// hanoi.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" void move(int n,char moveStart,char moveEnd){ printf("move %d from %c to %c\n",n,moveStart,moveEnd); } void hanoi(int n,char moveStart,char moveTemp,char moveEnd){ if (n == 1) { move

深入研究 Mini ASP.NET Core(迷你 ASP.NET Core),看看 ASP.NET Core 内部到底是如何运行的

前言 几年前,Artech 老师写过一个 Mini MVC,用简单的代码告诉读者 ASP.NET MVC 内部到底是如何运行的.当时我研究完以后,受益匪浅,内心充满了对 Artech 老师的感激,然后用我自己理解的 MVC 知识,写了一篇 深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的 ,写完更加加深了我对 ASP.NET MVC 的理解.今天 ASP.NET Core 已经更新到 3.0 Preview 4 了(今天是:2019-04

n阶Hanoi塔问题

假设有三个命名为x.y.z的塔座,在塔座x上插有n个直径大小各不相同.依小到大编号为1.2...n的圆盘,要求将x塔座上的n个圆盘移至z上,并仍按同样的顺序叠排,圆盘移动时应遵守下列规则: (1)每次只能移动一个圆盘: (2)圆盘可插在x.y和z中任何一个塔座上: (3)任何时刻都不能将一个较大的圆盘压在较小的圆盘上面. 如下图所示为3阶Hanoi塔问题的初始状态. 完整代码: 1 #include <stdio.h> 2 3 void Hanoi(int n, char x, char y,

POJ1958 Strange Towers of Hanoi --- 递推【n盘m塔Hanoi塔问题】

POJ1958 Strange Towers of Hanoi Sol: n盘4塔问题可以分为3步: 1.以4塔模式移走i个盘. 2.以3塔模式将剩余n-i个盘移至第4塔. 3.以4塔模式将第一步中的i个盘移至第4塔. 我们用\(d[i]\)表示在3塔模式下移i个盘的最小步数,\(f[i]\)表示在4塔模式下移i个盘的最小步数. 递推式:\(f[i]=\min_{1\leq j < i}(2*f[j]+d[i-j])\) EX 本题可以拓展至n盘m塔问题. \(f[i][j]\)表示在i塔模式下

Hanoi塔问题

传说在古代印度的贝拿勒斯圣庙里,安放了一块黄铜板,板上插了三根宝石柱(不妨设A.B.C柱),在A宝石柱上,自上而下按由小到大的顺序串有64个金盘.要求将A柱子上的64个金盘按照下面的规则移到C柱上. 规则: ①一次只能移一个盘子: ②盘子只能在三个柱子上存放: ③任何时候大盘不能放在小盘上面. 任务:输入正整数n(A柱上的盘子数),输出移动到C柱上的移动过程. 分析 :设A上有n个盘子. 1. n=1时,则将圆盘从A直接移动到C. 2. n=2时,则: ①将A上的1个圆盘移到B上: ②再将A上的

Hanoi塔

2017年07月29日 由<数据结构>(c语言版)[严蔚敏  吴伟民 编著]page54- page58 启发得到:根据递归原理.当n=1时,只需移动1次.当n=2时,需要移动3次.当n=3时.可以利用上题结论.经过我在公交车上的思考,可以得到递推公式.本次增加一层所需的移动量,是之前(增加一层之前)的所需的移动量的2倍,还没完,再加上1.这个使用语言表达起来还真有点繁琐.公式表达如下:(目前不知道怎么利用latex等编辑器的方式输入公式)最后可以得到当为n时的所需的移动次数的公式,结果看起来

Hanoi塔问题(递归)

#include<iostream> #include<cstdio> using namespace std; int sum; int f(int n,char a,char b,char c){ if(n == 1){printf("1 from a to b\n");sum++;return sum;} else { f(n-1,a,c,b); printf("%d from %c to %c\n",n,a,c);sum++; f(n

完成喽,以后玩hanoi塔各级作弊咯!

#include<stdio.h>// -------------------------- void h(int n,char a,char b,char c )// | {// | if(n==1)// | printf("%c->%c\n",a,c);// |子 else// |函 {// |数 h(n-1,a,c,b);// | printf("%c->%c\n",a,c);/// | h(n-1,b,a,c);// | }// --