W3 school 菜鸟教程 我要自学网 信息学奥赛NOI 花哥的博客 不逼自己一把,怎知自己有多优秀——校长语录

九连环解决方法

九连环的解决基本方法:想要改变某一个环的状态,须保证两点,第一,其前面一个环须是挂在横杆上,第二,更前面的环都没挂在横杆上,然后采用递推与递归的思想一步一步改变.

首先:了解环的状态.

 从右往左数,第一个环定义为横杆之下(取下),第二个环定义为横杆之上(挂起),第三环为非正常状态(尽量不要弄成这样,如果已经这样,把右边的全部取下,再把这个取下呈横杆之下状态),第4/5个均为横杆之上状态

其次:取下环的方法(以取下第5个环为例--当然,要取下第5个环,须得是第4个环在横杆之上,第1-3个环在横杆之下),步骤依次如下图1-5

 图1:第1-3个环在横杆之下,第4,5个环在横杆之上

 图2:取出第4个环,露出第5个环

 图3:取出第5个环,整个环都在横杆上方,不再是被横杆穿上的状态

 图4:把第5个环从横杆中间放下,同时穿上第4个环,最后第5,1-3个环均呈横杆之下状态,第4个环呈横杆之上状态

最后:附上C++程序代码

/*
九连环的解锁原理:欲改变第N个环的状态,必须保证其前一个环挂在横杆上,更前一所有环均未挂在横杆上
解决途径:递归. 
*/
#include<iostream>
using namespace std;
int lh[10],xh;
void cglh(int,int);
int main()
{
	int cur,op,fp;
	cout<<"请输入要处理环的序号:";
	cin>>cur;
	cout<<"\n请选择:1-挂上 2-取下 ";
	cin>>op;
	op%=2;
	fp=(op+1)%2;
	for(int i=cur;i>=1;i--)
	{
		cout<<"\n请输入第"<<i<<"个环的状态:(1-上面 0-下面)" ;
		cin>>lh[i];
	}
	for(int i=cur;i>=1;i--)cglh(i,op); 
	return 0;
 } 
 void cglh(int x,int f)
 {
 	if(lh[x]==f)return;
 	if(x>1)
 	{
		cglh(x-1,1);
	 	for(int i=x-2;i>=1;i--)
	 		cglh(i,0);
	 }
 	lh[x]=f;
 	xh++;
 	cout<<xh<<":";
 	if(f)cout<<"挂上第"<<x<<"个环\n";
	 else  cout<<"取下第"<<x<<"个环\n";
 }

  程序说明:如果要取下九连环,那输入的要处理的环号就是9,然后选择取下,再后就是输入当前环的状态(全挂上的就全输入1)

 

如有不足主不吝赐教,谢谢你的阅读!

 

 

posted @ 2021-11-07 23:50  耍人  阅读(2524)  评论(0编辑  收藏  举报