約瑟夫環問題求解

2021-10-19 23:27:21 字數 1451 閱讀 5239

josephu 問題為:設編號為 1,2,… n 的 n 個人圍坐一圈,約定編號為 k(1<=k<=n)的人從 1 開始報數,數到 m 的那個人出列,它的下一位又從 1 開始報數,數到 m 的那個人又出列,依次類推,直到所有人出列為止,由此 產生乙個出隊編號的序列。

提示:用乙個不帶頭結點的迴圈鍊錶來處理 josephu 問題:先構成乙個有 n 個結點的單迴圈鍊錶,然後由 k 結點起從 1 開 始計數,計到 m 時,對應結點從鍊錶中刪除,然後再從被刪除結點的下乙個結點又從 1 開始計數,直到最後乙個結點從鍊錶中刪除演算法結束。

//節點定義 

class

node

}

//問題處理

class

xunhuan_list

else}}

public

void

printall()

while

(temp!=first);}

public

void

josepfu

(int start,

int num)

//約瑟夫問題解決方案

for(

int i=

0;i1;i++

)//將兩個指標同時移到起點和起點前

while

(first!=helper)

system.out.

println

("這次要去死的人是"

+first.data)

; first=first.next;

helper.next=first;

} system.out.

println

("最後的倖存者為"

+first.data);}

}

public

class

main

}

執行結果如下

問題總結

關於迴圈鍊錶的建立思路。

約瑟夫問題的解決演算法

1.先建立乙個helper 指標 ,將此指標指向first指標的前乙個節點

然後 (如果是從第乙個節點開始 那麼就指向最後乙個節點),每次數數m就跳躍m-1次,然後將first指標移動到出圈節點的下乙個節點,然後將helper的next指標指向first,這樣就實行了出圈,以此類推。

———————————————這將會是很好的一生!

約瑟夫環問題求解

約瑟夫問題如下 n個人圍成圈,依次編號為1,2,n,現在從1號開始依次報數,當報到m時,報m的人退出,下乙個人重新從1報起,迴圈下去,問最後剩下那個人的編號是多少?input amount 佇列人數 m 數到m時退出乙個人 output 最後乙個退出的人的下標 思路 用布林陣列做 我們可以把這amo...

約瑟夫環求解O n

有n個人,編號從0到n 1,圍成圈,從0開始報數,第m個人出列,然後繼續從第m 1個人不斷報數 出列,求最後剩下的人是哪個。鍊錶模擬,時間複雜度為o nm 比較簡單,就不贅述了。考慮n個人0,1,2,3,n 1,從0開始報數到m,所以編號為m 1的人出列。剩下m,m 1,m 2,n 2,n 1,0,...

約瑟夫環遞迴求解

約瑟夫環是乙個數學的應用問題 已知m個人 以編號1,2,3.m分別表示 圍坐在一張圓桌周圍。從編號1開始報數,每次報到k的那個人出列,然後下乙個人再從1開始報數。求解 最後乙個出列的人的編號。使用遞迴 假設有10個人,編號為1 2 3 4 5 6 7 8 9 10,k 3。從1開始報數,則第一次出列...