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

双色汉诺塔问题

时间:2019-04-05 00:44:55      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:过程   window   条件   一个   测试数据   操作   style   表示   相同   

问题描述:

  已知 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;
}
 
运行界面:
 
技术图片
技术图片
 
 
 
 

 

双色汉诺塔问题

标签:过程   window   条件   一个   测试数据   操作   style   表示   相同   

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

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