1. 程式人生 > 遊戲 >《死亡之屋 重製版》4月7日登陸Switch 月底預購開啟

《死亡之屋 重製版》4月7日登陸Switch 月底預購開啟

問題描述

約瑟夫問題是個著名的問題: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;
}