演算法系列 約瑟夫斯問題

2022-04-29 11:39:09 字數 1714 閱讀 1127

約瑟夫斯問題(有時也稱為約瑟夫斯置換),是乙個出現在電腦科學

和數學中的問題。在計算機程式設計

的演算法中,類似問題又稱為約瑟夫環。

有個囚犯站成乙個圓圈

,準備處決。首先從乙個人開始,越過

個人(因為第乙個人已經被越過),並殺掉第k個人。接著,再越過

個人,並殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下乙個人留下,這個人就可以繼續活著。

問題是,給定了

和,一開始要站在什麼地方才能避免被處決?

[隱藏] 

4注釋5參考文獻

6外部鏈結

這個問題是以弗拉维奧·約瑟夫斯

命名的,它是1世紀的一名猶太歷史學家。他在自己的日記中寫道,他和他的40個戰友被羅馬軍隊包圍在洞中。他們討論是自殺還是被俘,最終決定自殺,並以抽籤的方式決定誰殺掉誰。約瑟夫斯和另外乙個人是最後兩個留下的人。約瑟夫斯說服了那個人,他們將向羅馬軍隊投降,不再自殺。約瑟夫斯把他的存活歸因於運氣或天意,他不知道是哪乙個。[1]

比較簡單的做法是用迴圈單鏈表模擬整個過程,時間複雜度是o(n*m)。如果只是想求得最後剩下的人,則可以用數學推導的方式得出公式。且先看看模擬過程的解法。

# -*- coding: utf-8 -*- 

class node(object):

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 = 5 #總的個數

m = 2 #數的數目

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

print cur.value

pre.next = cur.next

cur.next = none

cur = pre.next

print cur.value

#include using namespace std;

typedef struct _linknode linknode, *linknodeptr;

linknodeptr createcycle(int total)

curr->next = head;

return head;

}void run(int total, int tag) else

index = start;

} else {

prev = node;

node = node->next;

index++;

約瑟夫斯問題

有n個人圍成一圈,報數從1到m依次迴圈報數,報到m的就退出 死 現在我們來看遞推,由於為了方便表示 s m i 0的情況,我們讓第一人的編號為0,從一開始也可以 既然你問遞推,那步驟就不說了,只說這個公式吧 讓獲勝者的編號為0 最後乙個人只有他了當然是0 f i 表示獲勝者在剩下i個人時的那一局的編...

約瑟夫斯問題 關於約瑟夫斯問題的反饋

約瑟夫斯問題 我上週的文章是關於解決kotlin的約瑟夫斯問題的。為了便於比較,這是我最初編寫的版本 class soldier val position int fun isdead state state dead enum class state class circle private va...

演算法系列 N皇后問題

常規n皇后解決問題過程 一 問題描述 運用回溯法解題通常包含以下三個步驟 1 針對所給問題,定義問題的解空間 2 確定易於搜尋的解空間結構 3 以深度優先的方式搜尋解空間,並且在搜尋過程中用剪枝函式避免無效搜尋 通過上述的基本思路,我們可以將問題描述為 x j 表示乙個解的空間,j表示行數,裡面的值...