約瑟夫環問題之例 猴子選大王

2021-06-29 12:06:54 字數 1355 閱讀 9645

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

猴子選大王只是約瑟夫問題衍生出的乙個典型演算法例題,本篇博文介紹兩種解法:暴力法+回溯法。

暴力法:

#include#include#includeusing namespace std;

const int n=30;

int main()

{ int a[n];

memset(a,0,sizeof(a));

cout

int current=0;

for(int i=n;i>0;--i)

{ current=(current+getout-1)%i;//這裡是關鍵,每趟出隊的序號

printf("第%3d只猴子滾出去.\n",a[current]);

回溯法:

#include#includeusing namespace std;

const int n=9;

int main()

{ int a[n];

for(int i=0;i>index;

for(int i=n-1;i>=0;--i)//小夥伴們,能看出來,演算法的精髓嗎?其實i大於0就行了,不過...懶得改了

{ for(int k=1;k<=index;++k)//每次出隊時,把要出隊的序號排在陣列末尾

{ int temp=a[0];

for(int j=0;j=0;--i)

{ cout<

這題可算是熟悉約瑟夫環的乙個比較好的例子了,對回溯也是很好的詮釋。

回溯演算法也叫試探法,它是一種系統地搜尋問題的解的方法。

回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。

用回溯演算法解決問題的一般步驟為:

1、定義乙個解空間,它包含問題的解。

2、利用適於搜尋的方法組織解空間。

3、利用深度優先法搜尋解空間。

4、利用限界函式避免移動到不可能產生解的子空間。

問題的解空間通常是在搜尋問題的解的過程中動態產生的,這是回溯演算法的乙個重要特性。

猴子選大王問題(約瑟夫環)

一群猴子排成一圈,按1,2,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去 如此不停的進行下去,直到最後只剩下乙隻猴子為止,那只猴子就叫做大王。要求程式設計模擬此過程,輸入m n,輸出最後那個大王的編號。function monkey monke...

約瑟夫環(猴子選大王問題)

資料結構與演算法之約瑟夫環。與其枯燥的講解約瑟夫環,倒不如用約瑟夫環來解決乙個有趣的問題。猴子選大王問題 現在有n個猴子需要選取乙個猴王,這n個猴子手拉手圍成乙個圈,旁邊有一位德高望重的老猴,先將這一圈猴按順時針方向編號1,2.n,然後給每只小猴一張紙條,上面記錄著乙個數字m 非負數 並且由老猴王隨...

猴子選大王(約瑟夫環問題)

題目描述 n只猴子圍坐成乙個圈,按順時針方向從1到n編號。然後從1號猴子開始沿順時針方向從1開始報數,報到m的猴子出局,再從剛出局猴子的下乙個位置重新開始報數,如此重複,直至剩下乙個猴子,它就是大王。輸入輸入兩個整數n和m,1 m n 100。輸出輸出猴王的編號 樣例輸入 8 3樣例輸出 7 inc...