很多書在一開始就開始學(xué)習(xí)josephus問題,為了讓大家前面學(xué)起來較為容易我把前面涉及到此問題的地方都故意去掉了,現(xiàn)在我們已經(jīng)學(xué)習(xí)過了結(jié)構(gòu)體和類,所以放在這里學(xué)習(xí)可能更合適一些。
在正式開始學(xué)習(xí)之前我們先回顧一下如何利用數(shù)組和結(jié)構(gòu)體的方式來解決,最后我們再看一下如何利用面向?qū)ο蟮某橄罄砟钸M(jìn)行解決此問題的程序設(shè)計(jì),相互對比,找出效率最高,最容易理解,最方便維護(hù)的程序來,說明利用面向?qū)ο蟮某橄罄砟钸M(jìn)行程序設(shè)計(jì)的好處。
josephus問題其實(shí)就是一個游戲,一群小孩圍成一個圈,設(shè)置一個數(shù),這個數(shù)是個小于小孩總數(shù)大于0的一個整數(shù),從第一個小孩開始報(bào)數(shù),當(dāng)其中一個小孩報(bào)到你設(shè)置的那個數(shù)的時候離開那個圈,這樣一來反復(fù)報(bào)下去,直到只剩下最后一個小孩的時候那個小孩就是勝利者,寫程序來找出這個小孩。
以下是數(shù)組方法:
由于數(shù)組的限制我們必須預(yù)先假設(shè)好有多少個小孩,離開的小孩他自身設(shè)置為0來標(biāo)記離開狀態(tài)。
代碼如下: #include <iostream> using namespace std; void main() { const int num=10; int interval; int a[num]; for(int i=0; i<num; i++) { a[i]=i+1; } cout <<"please input the interval: "; cin >>interval; for(int i=0; i<num; i++) { cout <<a[i] <<","; } cout <<endl; int k=1; int p=-1; while(1) { for(int j=0;j<interval;) { p=(p+1)%num; if(a[p]!=0) { j++; } } if(k==num) { break; } cout<<a[p]<<","; a[p]=0; k++; } cout <<"\nNo." <<a[p] <<" boy've won.\n"; cin.get(); cin.get(); } 就數(shù)組解決來看,程序簡短但效率不高可讀性也不好,此代碼沒有什么特別之處主要依靠一個加1取模的方式來回到首位置,形成環(huán)鏈:p=(p+1)%num;。
|