双色汉诺塔问题
Posted batcaesar-mmm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双色汉诺塔问题相关的知识,希望对你有一定的参考价值。
问题描述:
已知 n ( n 是偶数)个盘子,大小相同的盘子有两个,叠放在一起,但下面的盘子是红色,上面的盘子是蓝色。
条件:
- 每次只能移动一个盘子
- 大盘子不能放在小盘子上面
- 在移动的过程中不能出现两个大小相同的盘子叠在一起,且下面的盘子是蓝色而上面的盘子是红色的情况。
. . . 表示红盘
- - - 表示蓝盘
= = = 表示底座
分析:
注意条件3中 大小相同,上红下蓝 是 先与后非 的关系,两个同时满足才成立。
故这个双色Hanoi塔问题 等价于 从上到下,从小到大依次排列的Hanoi塔问题,运用递归算法。
(注:Hanoi塔问题中,当n等于奇数时,第一个(n=1)盘子第一步肯定落在目标柱上;当n等于偶数时,肯定落在过渡柱上)
备注:
- 编程语言:c++
- 编译器:Code::Blocks 16.01
- 操作系统:windows 10
源代码:
//双色汉诺塔问题
/*测试数据:
6
6
(n为奇数时,是蓝盘;n为偶数时,是红盘)
(输出一行为一步,(n=6)共需63步)
*/
(输出一行为一步,(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作为过渡柱
}
}
{
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;
}
{
int n;
char a = ‘A‘,b = ‘B‘,c = ‘C‘;
cout<<"Input a number of disk:";
cin>>n;
Hanoi(n,a,b,c);
return 0;
}
运行界面:
以上是关于双色汉诺塔问题的主要内容,如果未能解决你的问题,请参考以下文章