双色汉诺塔问题

问题描述:

  已知 n ( n 是偶数)个盘子,大小相同的盘子有两个,叠放在一起,但下面的盘子是红色,上面的盘子是蓝色。

  条件:

  1. 每次只能移动一个盘子
  2. 大盘子不能放在小盘子上面
  3. 在移动的过程中不能出现两个大小相同的盘子叠在一起,且下面的盘子是蓝色而上面的盘子是红色的情况。

  . . .  表示红盘

  - - -  表示蓝盘

  = = =  表示底座

  分析:

  注意条件3中 大小相同,上红下蓝 是 先与后非 的关系,两个同时满足才成立。

  故这个双色Hanoi塔问题 等价于 从上到下,从小到大依次排列的Hanoi塔问题,运用递归算法。

  (注:Hanoi塔问题中,当n等于奇数时,第一个(n=1)盘子第一步肯定落在目标柱上;当n等于偶数时,肯定落在过渡柱上)

备注:

  •   编程语言:c++
  •   编译器:Code::Blocks 16.01
  •   操作系统:windows 10

源代码:

//双色汉诺塔问题

/*测试数据:
6

(n为奇数时,是蓝盘;n为偶数时,是红盘)
(输出一行为一步,(n=6)共需63步)
*/

#include<iostream>

using namespace std;

void Hanoi(int n,char a,char b,char c)
{
    if(n>0)
    {
        Hanoi(n-1,a,c,b);  //将n-1个盘子从A柱移到B柱,C作为过渡柱
        cout << n << a << "->" << c << endl;  //将A柱上剩下的一个直接移到C柱
        Hanoi(n-1,b,a,c);  //将n-1个盘子从A柱移到B柱,C作为过渡柱
    }
}

int main()
{
    int n;
    char a = ‘A‘,b = ‘B‘,c = ‘C‘;
    cout<<"Input a number of disk:";
    cin>>n;
    Hanoi(n,a,b,c);
    return 0;
}

运行界面:

原文地址:https://www.cnblogs.com/BATcaesar-mmm/p/Hanoi.html

时间: 2024-11-05 01:03:27

双色汉诺塔问题的相关文章

Ka的递归编程练习 Part4|Hanoi汉诺塔,双色汉诺塔的也有

1 #include <stdio.h> 2 void hanoi(int s,char a,char b,char c) //a是出发盘,b是中途盘,c是结束盘 3 { 4 if(s==0) return; 5 hanoi(s-1,a,c,b); //把最底下的从a借助c移动到b 6 printf("s from %c move to %c\n",a,c); 7 hanoi(s-1,b,a,c); //把刚才弄到b的借助a叠到c上 8 } 9 int main() 10

【三色汉诺塔】

/* 三色汉诺塔 */ #include <stdio.h> void hanoi(int disks, char source, char temp, char target) { if(disks == 1) { printf("move disk from %c to %c \n", source ,target); printf("move disk from %c to %c \n", source ,target); printf("

【二色汉诺塔 】

/* 二色汉诺塔 */ #include <stdio.h> void hanoi(int disks, char sources, char temp, char target) { if(disks == 1) { printf("move disk from %c to %c \n", sources, target); printf("move disk from %c to %c \n", sources, target); } else {

JavaScript算法实现之汉诺塔(Hanoi)

目前前端新手,看到的不喜勿喷,还望大神指教. 随着Node.js,Angular.js,JQuery的流行,点燃了我学习JavaScript的热情!以后打算每天早上跟晚上抽2小时左右时间将经典的算法都用JS来实现,加快学习JS的步伐(用这个办法方便跟自己以前学过的C++语言作对比,找出不同),希望自己能够坚持下去!!! 首先来个汉诺塔的. <script>      function hanoi(n,a,b,c){          if(n==1){              documen

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

从汉诺塔问题来看“递归”本质

汉诺塔问题 大二上数据结构课,老师在讲解"栈与递归的实现"时,引入了汉诺塔的问题,使用递归来解决n个盘在(x,y,z)轴上移动. 例如下面的动图(图片出自于汉诺塔算法详解之C++): 三个盘的情况: 四个盘的情况: 如果是5个.6个.7个....,该如何移动呢? 于是,老师给了一段经典的递归代码: void hanoi(int n,char x,char y,char z){ if(n == 1) move(x,1,z); else{ hanoi(n-1,x,z,y); move(x,

bzoj1019: [SHOI2008]汉诺塔(dp)

1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1739  Solved: 1062[Submit][Status][Discuss] Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的操作是指:从一根柱子的最上层拿一个盘子放到另一根柱子的最上层,同时要保证被移动的

汉诺塔(三)

汉诺塔(三) 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.庙宇和众生也都将同归于尽. 现在我们把三根针编号为1,2,3. 所

python 实现汉诺塔问题

代码如下: def hano(n,x,y,z): if n==1: print(x,"->",z) else: #将n-1个盘子从x->y hano(n-1,x,z,y) #将剩余的最后一个盘子从x->z print(x,"->",z) #将剩余的n-1个盘子从y->z hano(n-1,y,x,z) n = int(input("请输入汉诺塔的层数:")) hano(n,"A","B&