約瑟夫問題:39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓。於是決定了自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺。然後下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 和他的朋友並不想遵從,josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。
**實現了從任意位置開始報數的方法。令n = 5,m = 2,從第乙個人開始報數,結果為:2 4 1 5 3。
//輔助指標,幫助構建環形鍊錶
for(
int i =
1;i <= number;i++
)else}}
//遍歷
public
void
show()
boy curboy = first;
//輔助指標
while
(true
) curboy = curboy.
getnext()
;//後移}}
//根據輸入,計算出小孩出圈順序
/* startnum 表示從第幾個小孩開始
countnum 表示數幾次
nums 表示初始狀態下一共有多少小孩
*/public
void
countboy
(int startnum,
int countnum,
int nums)
//將first指標移動到指定位置
for(
int i =
0; i < startnum -
1; i++
)//建立輔助指標,並將其移動到環形鍊錶first節點的前驅節點位置
boy helper = first;
while
(true
) helper = helper.
getnext()
;}//根據countnum開始報數
while
(true
)for
(int i =
0; i < countnum -
1;i++
) system.out.
printf
("小孩%d開始出圈 \n"
,first.
getnum()
);first = first.
getnext()
; helper.
setnext
(first);}
system.out.
printf
("最後小孩%d留在圈裡"
,first.
getnum()
);}}
//boy類,表示乙個節點
class
boypublic
intgetnum()
public
void
setnum
(int num)
public boy getnext()
public
void
setnext
(boy next)
}
資料結構與演算法 約瑟夫問題
問題描述 編號為1 2 n 的小朋友圍成一圈,從編號為k 1 k n 的小朋友開始報數,報到m的小朋友出列,該小朋友的下一位重新開始從0開始報數,數到m的小朋友再次出列,依次類推,直到所有小朋友出列。由此產生乙個出列編號的佇列。package 鍊錶 author lyq on 2019 12 23 ...
資料結構與演算法 約瑟夫問題
已知n個人 以編號1,2,3,n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從k開始報數,數到m的那個人又出列 一詞重複下去。直到圓桌的人全部出列。試用c 程式設計實現 include include include define error 0 type...
資料結構與演算法(03)
1.雙鏈表應用例項 1.1雙向鍊錶的操作分析和實現 使用帶head頭的雙向鍊錶實現 管理單向鍊錶的缺點分析 1 單向鍊錶,查詢的方向只能是乙個方向,而雙向鍊錶可以向前或者向後查詢。2 單向鍊錶不能自我刪除,需要靠輔助節點,而雙向鍊錶可以自我刪除,單鏈表刪除時節點,總是找到temp,temp是刪除節點...