九連環的解決基本方法:想要改變某一個環的狀態,須保證兩點,第一,其前面一個環須是掛在橫桿上,第二,更前面的環都沒掛在橫桿上,然后采用遞推與遞歸的思想一步一步改變.
首先:了解環的狀態.
從右往左數,第一個環定義為橫桿之下(取下),第二個環定義為橫桿之上(掛起),第三環為非正常狀態(盡量不要弄成這樣,如果已經這樣,把右邊的全部取下,再把這個取下呈橫桿之下狀態),第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)
如有不足主不吝賜教,謝謝你的閱讀!