九连环简介
九连环游戏是中国人自己发明的,它的历史非常悠久,据说起源于战国时期。九连环主要是由一个框架和九个圆环组成:每个圆环上连有一个直杆,而这个直杆则在后面一个圆环内穿过,九个直杆的另一端用一块木板或圆环相对固定。
九连环规律
- 第 1 环可以自由上下
- 而上/下第 n 环时(n>1),则必须满足:第 n-1 个环在架上;前 n-2 个环全部在架下
拆解/安装的过程
正确的拆解是先以第 9 环为目标,先拆下它,简化为拆一个 8 连环。接着再也第 8 环为目标,拆下它,简化为拆一个 7 连环。以此类推,直至全部拆解。
正确是安装也是以第 9 环为目标,先装上它,简化为装一个 8 连环。接着再也第 8 环为目标,装上它,简化为装一个 7 连环。以此类推,直至全部安装。
递归算法
本算法逻辑适用任意个数的连环问题,于2002年11月6日设计,2006年2月28日修改如下
#include<iostream>
using namespace std;
class Ring
{
public :
Ring(int Num):RingNum(Num){}
void StartDown();
void StartUp();
private :
int RingNum;
void DownRing(int n);
void UpRing(int n);
};
void Ring::DownRing(int n)
{
if(n>2) DownRing(n-2 );
cout<<"下第"<<n<<"环" ;
if(n>2) UpRing(n-2 );
if(n>1) DownRing(n-1 );
}
void Ring::UpRing(int n)
{
if(n>1) UpRing(n-1 );
if(n>2) DownRing(n-2 );
cout<<"上第"<<n<<"环" ;
if(n>2) UpRing(n-2 );
}
void Ring::StartDown()
{
DownRing(RingNum);
}
void Ring::StartUp()
{
UpRing(RingNum);
}
int main()
{
Ring RingN(9 );
RingN.StartDown();
RingN.StartUp();
return 0 ;
}
using namespace std;
class Ring
{
public :
Ring(int Num):RingNum(Num){}
void StartDown();
void StartUp();
private :
int RingNum;
void DownRing(int n);
void UpRing(int n);
};
void Ring::DownRing(int n)
{
if(n>2) DownRing(n-2 );
cout<<"下第"<<n<<"环" ;
if(n>2) UpRing(n-2 );
if(n>1) DownRing(n-1 );
}
void Ring::UpRing(int n)
{
if(n>1) UpRing(n-1 );
if(n>2) DownRing(n-2 );
cout<<"上第"<<n<<"环" ;
if(n>2) UpRing(n-2 );
}
void Ring::StartDown()
{
DownRing(RingNum);
}
void Ring::StartUp()
{
UpRing(RingNum);
}
int main()
{
Ring RingN(9 );
RingN.StartDown();
RingN.StartUp();
return 0 ;
}
2002年九连环算法第1版:中国传统智力游戏--九连环的递归算法(九连环算法第1版)
2006年九连环算法第2版:九连环的递归算法(九连环算法第2版)
2016年九连环算法第3版:九连环算法(第3版)