約瑟夫環問題拓展 C C

2022-07-20 09:12:11 字數 898 閱讀 1469

這樣的情況該如何解決呢?

依照模擬的思路和**:

我們可以簡單的對其進行拓展。我們需要考慮的是下面三種情況:

第一種情況下,我們需要考慮如何在不改動原迭代器位置的情況下把符合要求的三個人的狀態設為不參與報數的狀態。於是定義了乙個新的等於原迭代器的迭代器temp,用它來將三人的狀態改變。由於三人的位置相連且不經過隊尾隊首轉換,所以只需要通過temp的自增便可以完成對三人狀態的改變。

第二種情況下,我們需要考慮隊尾隊首的轉換,即當 temp = s.end() 時,需要將temp = s.begin() 。

最後兩種情況下,我們需要考慮的是如何找到報數人的後面兩個參與報數的人,為了解決這個問題,我們可以寫乙個location函式,返回值型別為vector陣列的迭代器。具體**如下:

vector::iterator location(vector::iterator temp)

return temp;

}

寫完該函式後,我們不難發現,前兩種情況依然可以使用該函式完成對報數人後面兩人的查詢。因此四種情況的位置變換都可以歸納為一種情況,統一用上述函式完成。

除了報數人的狀態值變為 0 ,temp的位置指向每變換一次,temp所指向的值就變為 0 ,進行兩次位置變換和賦值,就完成了對三人狀態的改變。最後,需要讓原迭代器的指向和temp的最終指向相同,從而提高一點程式的效率。

我們來看看**:

int main(){

int m,n;

cin>>n>>m;

for(int q=0; q最後對vector陣列進行遍歷,把還可以參與報數的人(即狀態值為1的人)的原序號輸出,便是題目所需要的答案。

詳解約瑟夫環問題 C C

約瑟夫問題 n個人圍坐成一圈,從1開始順序編號 遊戲開始,從第乙個人開始由1到m迴圈報數,報到m的人退出圈外,問最後剩下的那個人原來的序號。問題分析 面對這樣迴圈報數的資料,我們最容易想到的就是用陣列進行報數的模擬,最後把存活的人的編號輸出。先貼上這種思路的 1 include2 include3 ...

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...

約瑟夫問題 約瑟夫環

約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...