約瑟夫問題(迴圈鍊錶法和公式法)python版

2021-09-26 03:42:59 字數 1853 閱讀 4307

n個人站在乙個等待被處決的圈子裡。第乙個人從1開始報數,報m的將被殺掉,下乙個人接著從1開始報。如此反覆,最後剩下乙個人就是最後的勝利者。

輸入:n,m。其中n為總人數,依次編號為0,1…n,m為被處決的報數數值。

輸出:最後活下來人的編號。

用迴圈單鏈表去模擬這個過程。n個人看做n個鍊錶節點,節點1的value為1,節點1的next指向節點2,節點2的value為2,節點2的next指向節點3,…,節點n的value為n,節點n的next指向節點1,構成乙個迴圈單鏈表。然後從節點1開始報數,如果報數到m就被刪除,最後剩下的那個節點的value就是活下來人的編號。python**如下:

class

node

: def __init__

(self, value)

: self.value = value

self.next = none

def create_linklist

(n):

head =

node(1

) pre = head

for i in

range(2

, n+1)

: newnode =

node

(i) pre.next= newnode

pre = newnode

pre.next = head

return head

n =8 # 總的個數

m =3 # 數的數目

if m ==

1: # 如果被處決的報數為1,直接輸出最後乙個值

print

(n)else

: head =

create_linklist

(n) pre = none

cur = head

while cur.next != cur: # 終止條件是節點的下乙個節點指向本身

for i in

range

(m-1):

pre = cur

cur = cur.next

pre.next = cur.next

cur.next = none

cur = pre.next

print

(cur.value)

遞推公式:

f (n

,m)=

(f(n

−1,m

)+m)

modn

f(n,m) =(f(n-1,m)+m)\ mod\ n

f(n,m)

=(f(

n−1,

m)+m

)modnf(

1,m)

=0

f(1,m) = 0

f(1,m)

=0**如下:

n =

8 # 總的個數

m =3 # 數的數目

if m ==

1: # 如果被處決的報數為1,直接輸出最後乙個值

print

(n)else

: i =

0 a =

list

(range

(n))

while

len(a)

>1:

i =(i+2)%

len(a)

del a[i]

print

(a[0]+

1)

約瑟夫問題-維基百科

約瑟夫環(鍊錶法,公式法)

約瑟夫環作為乙個數學問題,它的 實現方式有很多,比如迴圈鍊錶,公式解決或者動態規劃,之前參考資料也有用遞迴解決的。anyway,這些都是解決約瑟夫環問題很有效的方法。這裡總結兩種方法,迴圈鍊錶法和公式法。首先是迴圈鍊錶法,它的原理很簡單,也很容易理解。求解過程和人思考解決的過程很接近。設總人數為n,...

迴圈鍊錶 約瑟夫問題

設編號分別為 1,2,n的n個人圍坐一圈。約定序號為k 1 k n 的人從1開始計數,數到m的那個人出列,他的下一位又從1開始計數,數到m的那個人又出列,依次類推,直到所有人出列為止。演算法思路 1 先建立乙個有n個結點的單迴圈鍊錶,編號從1到n,代表n個人。2 找到第k個結點,即第乙個開始報數的人...

(迴圈鍊錶)約瑟夫問題

time limit 1000 ms memory limit 65536 kib submit statistic n個人想玩殘酷的死亡遊戲,遊戲規則如下 n個人進行編號,分別從1到n,排成乙個圈,順時針從1開始數到m,數到m的人被殺,剩下的人繼續遊戲,活到最後的乙個人是勝利者。請輸出最後乙個人的...