Josephus問題總結

2021-07-29 13:29:17 字數 861 閱讀 5843

josephus問題:n個人排成乙個圈,從其中個人從1開始報數,數到m的人自動出列,接著下乙個人又從1開始報數。如此迴圈往復,直到只剩下乙個人,則此人獲勝。

假設出列的人是被斃了,這時你有兩個方式:

(1)標記法:記錄完所有loser,最後判斷出winner時,再把loser一起斃掉

(2)直接刪除法:數到乙個loser斃乙個,直到出現winner

上面的方法(1)便於在順序線性表(陣列)中使用,(2)便於在動態鍊錶中使用 。

下面就兩種方法給出**:

(1)標記法

它的空間複雜度是 o(n),時間複雜度是

#include using namespace std;

int main()node, * link;

int main()

curr->next=cur->next;

cout delete cur; //當然可以寫乙個delete函式,專門刪除節點,那麼我就可以不設跟蹤指標了

no++; //不過有delete函式的話,因為要遍歷鍊錶,那麼時間複雜度更高

if((no+1)==n) break;

cur=curr=curr->next;

} // 輸出優勝者

cout<<"\nthe winner is:"num,因為,jose已經丟了,這就是不帶頭結點的不好之處。

return 0;

}void createlist(link &l,int n)

}node *start(link l,int start)

return p;

}

Josephus 約瑟夫 問題

問題描述 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到剩下最後乙個人。程式的意圖是求出最後留下的人的編號。c 實現 include include include u...

約瑟夫(Josephus)問題

一群小孩圍成一圈,任意假定乙個數n,從第乙個小孩起,順時針方向數,每數到第m個小孩時,該小孩便離開。小孩不斷離開,圈子不斷縮小。最後剩下的乙個小孩便是勝者。求勝者的編號?函式名稱 josephus 作 成 者 erick.wang 作成日期 2016 07 19 返 回 值 void 參 數 m,n...

Josephus問題(模擬)

題目 約瑟夫問題,輸入小孩人數num和每數到第m個小孩離開,問最後乙個小孩是原序列第幾個?資料範圍 num,m 10000 思路 有兩種方法,第一種按題意直接模擬 時間複雜度較大 第二種通過倒推出通項,在此不贅述 一 include using namespace std const int max...