藍橋杯 - 猴子選大王 (約瑟夫問題)
阿新 • • 發佈:2019-03-19
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 30if(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 }
藍橋杯 - 猴子選大王 (約瑟夫問題)