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的人被殺,剩下的人繼續遊戲,活到最後的乙個人是勝利者。請輸出最後乙個人的...