用陣列模擬實現約瑟夫環
阿新 • • 發佈:2018-11-27
約瑟夫問題:n個人圍成一圈,從第一個人開始報數,數到m的人出圈;再由下一個人開始報數,數到m的人出圈;…輸出依次出圈的人的編號。n,m由鍵盤輸入。
要求: 用陣列模擬實現 。
#include <iostream> #include <cstring> using namespace std; const int MAXN = 10000 + 7; const int INF = 0x3f3f3f3f; int arr[MAXN]; int n, m; void init() // 初始化編號 { for(int i=1; i<=n; i++) arr[i] = i; } void del(int &index) // 引用,因為當 index == n 時,我們需要修改 index 的值 { if(index == n) { index = 1; return; } for(int i=index; i<n; i++) // 刪除某個一個元素 { arr[i] = arr[i+1]; } } void solve() { int index = 1; while(n > 0) { for(int i=1; i<m; i++) { index ++; if(index > n) // 如果下標超出總數, 則從一開始,相當於一個環 index = 1; } cout << arr[index] << " "; del(index); n --; // 每次刪除後元素總個數減一 } cout << endl; } int main() { while(cin >> n >> m) { memset(arr, 0x3f, sizeof(0)); // a[i] = 0x3f3f3f3f; init(); solve(); } return 0; }