資料結構 約瑟夫環問題

2021-10-12 16:37:35 字數 1069 閱讀 1203

約瑟夫問題是個有名的問題:n個人圍成一圈,從第乙個開始報數,第m個將被殺掉,最後剩下乙個,其餘人都將被殺掉。例如n=6,m=5,被殺掉的順序是:5,4,6,2,3。

分析:(1)由於對於每個人只有死和活兩種狀態,因此可以用布林型陣列標記每個人的狀態,可用true表示死,false表示活。

(2)開始時每個人都是活的,所以陣列初值全部賦為false。

(3)模擬殺人過程,直到所有人都被殺死為止。

既然約塞夫問題就是用人來舉例的,那我們也給每個人乙個編號(索引值),每個人用字母代替

下面這個例子是n=8 m=3的例子

我們定義f(n,m)表示最後剩下那個人的索引號,因此我們只關係最後剩下來這個人的索引號的變化情況即可。

從8個人開始,每次殺掉乙個人,去掉被殺的人,然後把殺掉那個人之後的第乙個人作為開頭重新編號

第一次c被殺掉,人數變成7,d作為開頭,(最終活下來的g的編號從6變成3)

第二次f被殺掉,人數變成6,g作為開頭,(最終活下來的g的編號從3變成0)

第三次a被殺掉,人數變成5,b作為開頭,(最終活下來的g的編號從0變成3)

以此類推,當只剩乙個人時,他的編號必定為0!(重點!)

現在我們知道了g的索引號的變化過程,那麼我們反推一下

從n = 7 到n = 8 的過程

如何才能將n = 7 的排列變回到n = 8 呢?

我們先把被殺掉的c補充回來,然後右移m個人,發現溢位了,再把溢位的補充在最前面

神奇了 經過這個操作就恢復了n = 8 的排列了!

;注:參考leetcode大佬解

資料結構 約瑟夫環問題

實驗一線性表的應用 實驗目的和要求 通過實驗進一步理解線性表的邏輯結構和儲存結構,提高使用理論知識指導解決實際問題的能力,熟練掌握鍊錶的實際應用。主要內容 題目1 josephus環問題 問題描述 約瑟夫 joseph 問題的一種描述是 編號為1,2,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼...

資料結構 約瑟夫環問題

1.問題描述 約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。鍊錶思路 我是通過單鏈表實現的,首先要思考...

資料結構之約瑟夫環問題

有 n 個人,按 1 到 n 編號,要求從第 s 個人開始迴圈報數,報到 m 時,此人出列,再從下乙個人開始報 m個數,直到所有人出列。給出 n 個人出列的順序。include stdio.h typedef struct nodelnode,linklist void creatjoseph li...