起源
約瑟夫環問題的起源來自猶太歷史學家約瑟夫和他的朋友以及39其餘的猶太人,總共41人為了躲避敵人,藏在乙個山洞中,
39個猶太人決定寧願死也不被敵人抓到,於是決定自殺,所有人排成乙個圈,由第乙個人開始報數,每當數到3,就自殺。
這個遊戲接著從自殺的位置開始,還是從1數到3。依次類推,約瑟夫將朋友和自己安排在了16和31的位置,最後順利逃過了
自殺這一劫,因為最後就剩他乙個人了。
題目描述
n 個人圍成一圈,從第乙個人開始報數,數到 k 的人出列,再由下乙個人重新從 1 開始報數,數到 k 的人再出圈,依次類推,直到所有的人都出圈,請輸出依次出圈人的編號。
輸入輸入兩個整數,n和m
輸出輸出一行 n 個整數,按順序輸出每個出圈人的編號。
傳送門約瑟夫問題
思路1我們可以用迴圈陣列實現,數到指定的數過後,就標記為已出圈並且統計出圈人數,直到出圈人數等於所有人數。
**
#include
#include
#include
using
namespace std;
int arr[
105]
;bool vis[
105]
;int
main()
i++;}
return0;
}
思路2
我們也可以把這個題想象為是乙個佇列操作,先把每個數壓入佇列,然後從隊頭開始遍歷,如果報數等於指定數,則彈出佇列,否則壓入這個數(壓入則是在隊尾),再彈出這個數,如果這裡不理解,手畫一遍,就能明白。
**
#include
#include
#include
#include
using
namespace std;
intmain()
else
}return0;
}
當然如果題目求最後乙個被殺死的人,我們還有效率更高,更巧妙地演算法,鏈結在這裡約瑟夫環 約瑟夫環 佇列實現
約瑟夫環這個經典的資料結構鍊錶問題,想必大家都有所涉及。我們怎麼用佇列去實現這個問題呢,首先我們要將所有的人進行入隊操作,因為編號是1 n,那麼我們使用乙個迴圈壓入就行。for int i 1 i n i 然後我們會發現只要留下最後乙個人即不再報數了,所以我們可以判斷當佇列的長度大於1時便讓佇列一直...
用迴圈佇列求解約瑟夫環問題
用迴圈佇列求解約瑟夫環問題普通形式求解 對比分析 設有n個人站成一圈,其編號為1 n。從編號為1的人開始按順時針方向1 2 迴圈報數,數到m的人出列,然後從出列者的下乙個人重新開始報數,數到m的人又出列,如此重複進行,直到n個人都出列為止。要求輸出這n個人的出列順序。例子展示 當n 5,m 2時的約...
約瑟夫環(約瑟夫問題) 採用迴圈單鏈表實現
yuesefuwenti.cpp 定義控制台應用程式的入口點。約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部...