《死亡之屋 重製版》4月7日登陸Switch 月底預購開啟
阿新 • • 發佈:2022-03-05
問題描述
約瑟夫問題是個著名的問題:N個人圍成一圈,第一個人從1開始報數,報M的將被殺掉,下一個人接著從1開始報。如此反覆,最後剩下一個,求最後的勝利者。
解決方式
1.陣列模擬
2.遞迴處理
模擬
#include <iostream> using namespace std; const int N = 1e6 + 10; int n, m; int a[N]; int main() { cin >> n >> m;//總共多少人,數到多少退出 int cnt = 0, i = 0, k = 0;//退出的人數,計數到第幾個,報數。 while (cnt != n) { i ++; if (i > n) i = 1; if (a[i] == 0) { k ++; if (k == m) { a[i] = 1; cnt ++; cout << i << ' '; k = 0; } } } return 0; }
遞迴
#include <iostream> using namespace std; int ysf(int n, int k, int i) {//n個人的環,數到k的人退出,第i個人退出的編號 if (i == 1) return (n + k - 1) % n; else return (ysf(n - 1, k, i - 1) + k) % n; } int main() { int n, m; cin >> n >> m; for (int i = 1; i <= n; i ++ ) cout << ysf(n, m, i) + 1 << ' ';//每次退出的人編號順序輸出 return 0; }