九度题目1188 约瑟夫环

题目描述:
N个人围成一圈顺序编号,从1号开始按1、2、3……顺序报数,报p者退出圈外,其余的

人再从1、2、3开始报数,报p的人再退出圈外,以此类推。
请按退出顺序输出每个退出人的原序号。

输入:
包括一个整数N(1<=N<=3000)及一个整数p。

输出:
测试数据可能有多组,对于每一组数据,
按退出顺序输出每个退出人的原序号。

1
2
3
4
样例输入: 
7 3
样例输出:
3 6 2 7 5 1 4

链表环思想

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<bits/stdc++.h>
using namespace std;
#define MAX 1000
vector<int> vec(MAX,0);
struct node{
int v;
bool flag;
node *next;
};
int main(){
int n,P;
cin>>n>>P;
node *head=new node();
head->flag=false;
// head->next
head->v=1;
node *tmp=head;
for(int i=2;i<=n;i++) {
node *t=new node();
t->v=i;
t->flag=false;
tmp->next=t;
tmp=t;

}
tmp->next=head;
node *p=head;
int num=0;

bool flag1=false;
while(p&&n>0){
if(!p->flag){
num++;
if(num==P){
if(flag1==false)
{
cout<<p->v;
flag1=true;
}
else cout<<" "<<p->v;
num=0;//重新計數
n--;//出去的个数
p->flag=true; //做标记
}
// p->flag=true; 注意放的位置
}
p=p->next;

}
}

参考链接
https://blog.csdn.net/wzy_1988/article/details/8924408