OJ 約瑟夫環問題(迴圈鍊錶解法)

2021-10-03 05:04:05 字數 1462 閱讀 6390

有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來的第幾號的那位。

輸入初始人數n

輸出最後一人的初始編號

樣例輸入

3樣例輸出

2故事背景:

據說著名猶太歷史學家 josephus 有過以下的故事:在羅馬人占領喬塔帕特後,39個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人 開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止,然而 josephus 和他的朋友並不想遵從,josephus 要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。

約瑟夫環(約瑟夫問題)是乙個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0~n-1,最後 [1] 結果+1即為原問題的解。

#include

#include

//約瑟夫環問題,迴圈鍊錶

typedef

struct student

*node,node;

// 定義資料型別,結構體指標node,結構node

node creat

(int n)

;//建立鍊錶函式

void function ( node plist,

int report)

;//處理鍊錶

int main (

)node creat

(int n)

q->next = p_first-

>next;

//尾節點與首節點搭在一起,迴圈鍊錶構造

return p_first;

}void function ( node plist,

int report)

//這個函式實現鍊錶的處理

q=p-

>next;

//此時的q作為記錄需要刪除的節點的位置

p->next = q-

>next;

// q的next節點即需要刪除的位置的下乙個節點,

// 把這個位址值復給p->next,即把p節點刪除

p=p-

>next;

//前面的處理完了之後,移動到這個位置開始報數(從1開始)

free

(q);

//釋放q節點,for 迴圈的下乙個迴圈接著用

}printf

("%d\n"

,p->data)

;free

(p);

//釋放最後只剩下乙個節點的記憶體

}

假設n值為5,**如下(注下圖參考鏈結2)

約瑟夫環的鍊錶解法

約瑟夫環 鍊錶解法 之前遇到乙個面試題,大意是 電梯裡一擁而上一群人,導致電梯超重,於是大家約定,站成一圈,任選一人開始報數,數到3的那個人出電梯,圈內的下乙個人重新從1開始報數,數到3的人再出電梯,一直這樣,直到電梯不超重。現給一串有序的數字,電梯超重需出去m個人,數到k的人出電梯,讓列出出電梯的...

迴圈鍊錶解決約瑟夫環問題

題目要求的約瑟夫環操作 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人只有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個仍開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...

迴圈鍊錶解決約瑟夫環問題

問題描述 假設有n個小孩按照序號1,2,n圍坐成一圈,從第乙個小孩開始報數,每次報到n的人退出,接著從下乙個人重新開始從1開始報數,下一次再報到n的人退出,求最後乙個留下的人 小孩的個數n,和報數的n由鍵盤輸入 輸出留下人的序號 乙個迴圈鍊錶都寫得除出了很多問題,改了半天才出來 include in...