約瑟夫斯問題(有時也稱為約瑟夫斯置換),是乙個出現在電腦科學
和數學中的問題。在計算機程式設計
的演算法中,類似問題又稱為約瑟夫環。
有個囚犯站成乙個圓圈
,準備處決。首先從乙個人開始,越過
個人(因為第乙個人已經被越過),並殺掉第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表示行數,裡面的值...