1. 程式人生 > >藍橋杯 - 猴子選大王 (約瑟夫問題)

藍橋杯 - 猴子選大王 (約瑟夫問題)

names cout 原來 編號 初始 思想 -- using ron

標題:猴子選大王

一群猴子要選新猴王。新猴王的選擇方法是:讓N只候選猴子圍成一圈,從某位置起順序編號為1~N號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下一只猴子開始同樣的報數。如此不斷循環,最後剩下的一只猴子就選為猴王。請問是原來第幾號猴子當選猴王?

輸入格式:

輸入在一行中給一個正整數N(≤1000)。

輸出格式:

在一行中輸出當選猴王的編號。

輸入樣例:

11

輸出樣例:

7

思路一:用數組模擬一個環,存儲第下標+1位猴子是否退出(因為下標從0開始),數組初始化為0,每次輪到數3的猴子就將他的下標置為-1,最後一個下標不為-1的猴子就是選中的王。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = 1000; //共有N個猴子
 5 
 6 int a[N];   //用數組和%操作模擬圈
 7 
 8 int index = 0;  //下標index
 9 int i = 1;  //用來對3計數
10 int counter;    //記錄每次剩下的猴子個數
11 
12 int main()
13 {
14     int num;    //num是猴子的數量
15     cin >> num;
16     counter = num;
17 18 while(counter > 1) 19 { 20 if(a[index] != -1) //當下標為index的猴子還在圈內時 21 { 22 if(i == 3) 23 { 24 a[index] = -1; //將數到3的猴子退出圈子 ,將下標置為-1 25 counter--; //剩下的猴子總個數-1 26 } 27 28 i++; 29 30
if(i > 3) //i=4時候,i要回到1 31 { 32 i = i % 3; 33 } 34 } 35 36 index++; 37 38 if(index >= num) //當下標達到了猴子總數時,要回到開頭 39 { 40 index = index % num; 41 } 42 43 } 44 45 for(int i = 0; i < num; i++) 46 { 47 if(a[i] != -1) 48 { 49 cout << i + 1; //數組下標是從0開始的,要+1 50 } 51 } 52 53 return 0; 54 }

思路2:使用遞歸思想

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int fun(int n)
 5 {
 6     if(1 == n)
 7     {
 8         return 0;
 9     }
10 
11     return (fun(n - 1) + 3) % n;
12 }
13 
14 int main()
15 {
16     int n;
17     cin >> n;
18     cout << fun(n) + 1;
19     return 0;
20 }

藍橋杯 - 猴子選大王 (約瑟夫問題)