约瑟夫环
问题描述
约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。
解决方式
1.数组模拟
2.递归处理
3.公式法
模拟
#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;
}
公式法
x = a + m^n
y = ma + 1
x为总人数,m为数到第几就出局的数,y为最后存活的人

浙公网安备 33010602011771号