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開始報數,則第一次出列...