資料結構與演算法03 約瑟夫問題

2021-10-02 13:12:19 字數 1956 閱讀 1431

約瑟夫問題: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是刪除節點...