P1996 约瑟夫问题
题目描述
\(n\) 个人围成一圈,从第一个人开始报数,数到 \(m\) 的人出列,再由下一个人重新从 \(1\) 开始报数,数到 \(m\) 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 \(n-1\) 名小朋友,而该题是全部出圈。
输入格式
输入两个整数 \(n,m\)。
输出格式
输出一行 \(n\) 个整数,按顺序输出每个出圈人的编号。
输入输出样例 #1
输入 #1
10 3
输出 #1
3 6 9 2 7 1 8 5 10 4
说明/提示
\(1 \le m, n \le 100\)
直接看代码
相当于环状链,逐步取出节点的过程,这篇写得详细约瑟夫问题
#include<iostream>
#include<cstring>
using namespace std;const int N = 200;
int p[N],ne[N];int main() {int n, m;cin >> n >> m;for(int i = 0;i < n;++i) ne[i] = i + 1; //留着0,这样输出的时候至少有两个节点,kne[n] = 1;int p = 0;for(int i = 1;i <= n;++i) {for(int j = 1;j < m;++j)p = ne[p];cout << ne[p] <<' '; //到m-1的位置,方便输出下一位int t = p; // p = ne[p]; //ne[t] = ne[ne[t]]; //这里删除m位节点,并且p指向被删除节点,因为,从0位移动m-1次才到m-1位}return 0;
}