最新文章
这里会显示最新的几篇文章摘要。
记录生活,分享知识,与你一起成长。
这里会显示最新的几篇文章摘要。
\(n\) 个人围成一圈,从第一个人开始报数,数到 \(m\) 的人出列,再由下一个人重新从 \(1\) 开始报数,数到 \(m\) 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 \(n-1\) 名小朋友,而该题是全部出圈。
输入两个整数 \(n,m\)。
输出一行 \(n\) 个整数,按顺序输出每个出圈人的编号。
10 3
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,这样输出的时候至少有两个节点,k
ne[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;
}