帶密碼的約瑟夫環的解題思路

2021-08-29 12:08:19 字數 1166 閱讀 7846

題目:

編號為1,2,…,n的n個人按順時針方向圍坐一圈,每個人持有乙個密碼(正整數)。一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m 值,從他在順時針方向上的下乙個人開始重新從1報數,如此下去,直到所有人全部出列為止。

學完鍊錶後面的題目,最後一題就是要求用鍊錶實現約瑟夫環帶密碼的問題。

很明顯建立乙個迴圈鍊錶可以實現我們想要的結果。

單迴圈鍊錶的建立與單鏈表的建立一樣,只是將尾結點的指標域指向頭指標所在的位址。

宣告乙個人的結構體,每個人有自己的編號和所攜帶的密碼,所以:

struct node

;

建立單迴圈鍊錶:

void

createlist

(node *

*head,

int n)

//資料錄入與單迴圈鍊錶的建立

p2->next =

*head;

//尾結點指向頭結點

}

錄入資料後,建立好了乙個單迴圈鍊錶。

接下來是主函式:

int

main()

free

(pf)

;//釋放被踢出的那個人所在的位置

m = p1->m;

//密碼值的更換

printf

("%d "

,p1->position)

;//輸出被提出的那個人的位置

p2->next = p1->next;

//重新連線鍊錶

n--;}

puts(""

);system

("pause");

return0;

}

實現的過程:

通過for迴圈,使得鍊錶指標指到將要被踢出人所在的位置,踢出可以理解為釋放掉那個人在的位置,並且把被釋放的結點左右結點接合起來,再次形成鏈式結構。

測試情況:

迴圈鍊錶解決帶密碼的約瑟夫環問題

這裡用迴圈鍊錶實現乙個帶密碼的約瑟夫環 意思是有n個人,編號1 n,他們每個人手裡拿著屬於自己的密碼。大家按照編號坐成一圈,然後給定乙個數m,然後大家從頭進行0 m報數,報到m的人出列,交出密碼,剩餘的人從這裡開始繼續報數,規則一樣.直到全部出列,問你最後的密碼是什麼?easy 有頭結點迴圈鍊錶實現...

約瑟夫環的實現

用迴圈鍊錶實現的,思路很簡單,只是要注意指標的修改,程式設計基礎差的容易出錯。約瑟夫環 迴圈鍊錶實現 author milo.wang date 2012 9 15 include using namespace std typedef struct node node,nodeptr void j...

約瑟夫環的O n 演算法

問題描述 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列,求最後乙個出列人的編號。為了討論方便,先把問題稍微改變一下,並不影響原意 問題描述 n個人...