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


標題:猴子選大王

一群猴子要選新猴王。新猴王的選擇方法是:讓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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM