經典問題 約瑟夫環

2021-09-27 07:37:05 字數 798 閱讀 2752

約瑟夫環就是n個人圍在一起丟手絹。手絹每經過乙個人報乙個數,開始的時候從第乙個人開始報數1,報數依次增加。若報到3的人出局,並且下乙個人重新從1開始報數。直到局內剩下兩個人。

這個問題的輸入有兩個。第乙個是n,參與遊戲的人數。第二個是m,最後留下的倖存者人數。

輸出有一行,是倖存者的編號。

這個問題有兩種解題思路。第一種是遞迴法,找到遞推關係。第二種則是依靠迴圈鍊錶進行模擬。

實際上,這是同乙個過程從前後兩個方向進行推導。

基於迴圈鍊錶的解決方案便是建立乙個有n個節點的迴圈鍊錶,模擬其過程,得到答案。

對此,我們只需要乙個指標指向第乙個節點。在每次報到m時,刪除當前指標指向的節點,並且下乙個從1

開始報號。

public

static linkedlist

josephus

(int n,

int m)

iterator

it = jos.

iterator()

;int i =

0, a = m;

while

(jos.

size()

>= m)

i++;if

(i == a)

else

}return jos;

}

遞迴的核心便是找到每次報數時,倖存者的序號變化規律。

for

(int i = m -

1; i <= n;

++i)

經典約瑟夫環問題

1 coding utf 8 2 author diva 3 使用者輸入n,n代表人數,圍成一圈,順序排號 4 從第乙個開始報數,1,2,3,數到3的人,退出圈子 5 6 報數邏輯,數到3的把對應的位置置為0,直到剩下最後乙個人 7 def num report list create 8 n 0 ...

經典演算法之約瑟夫環問題

前幾天看到乙個程式設計題,約瑟夫環問題。問題的由來是乙個猶太故事,41乙個人被困,有39個人想要自殺,想活下去的兩個人就出主意說,大家圍成乙個環,報到3的人自殺。結果兩個人成功脫險,也就誕生了這個演算法。由於本人實力有限,寫出的程式也並未進行優化,可能時間複雜度和空間複雜度上有很多問題,只希望給各位...

C 經典題目 約瑟夫環問題

有n個人圍成一圈,順序排號。從第乙個人開始報數 1 3報數 凡報到3的人退出圈子,問最後留下的人原來排在第幾號。首先由使用者輸入人數n,然後對這n個人進行編號 因為如果不編號的話,我們就不能知道最後是哪位童鞋留下來了 然後就開始了一圈一圈的迴圈,不斷形成新的圈子,不斷有人被淘汰,那麼迴圈到什麼時候截...