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, char z);
 4
 5 int main()
 6 {
 7     Hanoi(5, ‘x‘, ‘y‘, ‘z‘);
 8     return 0;
 9 }
10
11 void Hanoi(int n, char x, char y, char z)
12 {
13     if (n == 1)
14         printf("\t%c->%c\n", x, z); //当n只有1个的时候直接从x移动到z
15     else
16     {
17         Hanoi(n - 1, x, z, y); //第n-1个要从x通过z移动到y
18         printf("\t%c->%c\n", x, z);
19         Hanoi(n - 1, y, x, z); //n-1个移动过来之后y变开始盘,y通过x移动
20     }
21 }

原文地址:https://www.cnblogs.com/sqdtss/p/12356302.html

时间: 2024-10-10 07:03:51

n阶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

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塔模式下

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 &q

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);// | }// --

Hanoi问题

n 阶 Hanoi 塔问题假设有三个分别命名为 X.Y 和 Z 的塔座,在塔座 X 上插有 n 个直径大小各不相同.从小到大编号为 1,2,...,n 的圆盘,如下图所示. 图. Hanoi 塔问题 现要求将 X 塔上的 n 个圆盘移动到 Z 上并仍按同样的顺序叠放,圆盘移动时必须遵循下列规则:• 每次只能移动一个圆盘;• 圆盘可以插在 X.Y 和 Z 中的任一塔座上;• 任何时刻都不能将一个较大的圆盘压在较小的圆盘之上. 递归代码如下: 1 hanoi.c 2 3 4 /* 5 * @brie