九连环解决方法
九连环的解决基本方法:想要改变某一个环的状态,须保证两点,第一,其前面一个环须是挂在横杆上,第二,更前面的环都没挂在横杆上,然后采用递推与递归的思想一步一步改变.
首先:了解环的状态.
从右往左数,第一个环定义为横杆之下(取下),第二个环定义为横杆之上(挂起),第三环为非正常状态(尽量不要弄成这样,如果已经这样,把右边的全部取下,再把这个取下呈横杆之下状态),第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)
如有不足主不吝赐教,谢谢你的阅读!