九連環解決方法


九連環的解決基本方法:想要改變某一個環的狀態,須保證兩點,第一,其前面一個環須是掛在橫桿上,第二,更前面的環都沒掛在橫桿上,然后采用遞推與遞歸的思想一步一步改變.

首先:了解環的狀態.

 從右往左數,第一個環定義為橫桿之下(取下),第二個環定義為橫桿之上(掛起),第三環為非正常狀態(盡量不要弄成這樣,如果已經這樣,把右邊的全部取下,再把這個取下呈橫桿之下狀態),第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)

 

如有不足主不吝賜教,謝謝你的閱讀!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM