**大牛的!!!
aclayton's acm/icpc life 只切菜題 菜鳥亂飛
路漫漫其修遠兮 我要上下左右東南西北中發白而求索
在沒有明白約瑟夫問題之前,只能用模擬來做.
約瑟夫問題是這樣的:
假設n個人,編號為1到n,排成乙個圈,順時針從1開始數字m,數到m的人殺了,剩下的人繼續遊戲.活到最後的乙個人是勝利者.一般來說需要程式設計求解最後乙個人的編號.
思路是這樣的:
假設當前剩下i個人(i<=n),顯然這一輪m要掛(因為總是從1開始數).經過這一輪,剩下的人是:1 2 3 ... m- 1 m + 1
... i, 我們將從m+1開始的數對映成1, 則m+2對應2, n對應i - m, 1對應成i - m + 1 m - 1對應i -
1,那麼現在的問題變成了已知i - 1個人進行迴圈報數m,求出去的人的序號。假設已經求出了i-
1個人迴圈報數下最後乙個出去的人的序號x0,那麼它在n個人中的序號x1=(x0+ m - 1) % n + 1, 最初的x0=1
,反覆迭代x0和x1可以求出.
簡單約瑟夫問題的解法:
#include
<
stdio.h
>
main()
參考**如下:
#include
<
stdio.h
>
inty(
intn,
intm)
main()
printf(
"%d\n
",m);}}
約瑟夫演算法
宣告 本文僅為個人查閱方便所轉,版權為原文作者 本演算法僅適用於找出最後的勝利者,而不是得到出列序列。此方法從考慮n 1個人中最終勝利者 最後乙個沒有出列的人是誰 遞推到n個人時最終勝利者是誰。但是並不能得到出列的序列。無論是用鍊錶實現還是用陣列實現都有乙個共同點 要模擬整個遊戲過程,不僅程式寫起來...
約瑟夫環演算法
約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。2b求解 private void myjosf int teamle...
演算法 約瑟夫環
已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍 使用 list 來模擬環結構,不被淘汰則將其加入到 list 尾部,淘汰的直接移除。需注意,以編號 k 為第乙個報數的人,需要調整其在報數正式開啟前到 list 的頭部。param n 人的總數 param k 開始報數的序號,1 k n...