题目背景
约瑟夫是一个无聊的人!!!
题目描述
n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.
记得当年(一个月以前?)根本不会写这道题0.0现在感觉好水啊。。
写个循环链表。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1005;
int cnt=0;
struct m{
int pre,to,next;
}v[MAXN];
int n,m;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
++cnt;
if(i!=n){
if(i==1){
v[cnt].pre=n;
v[cnt].next=i;
v[cnt].to=i+1;
}
else {
v[cnt].pre=i-1;
v[cnt].next=i;
v[cnt].to=i+1;
}
}
else {
v[cnt].pre=i-1;
v[cnt].next=i;
v[cnt].to=1;
}
}
int times=0,shu=0;
for(int i=v[1].next;i;i=v[i].to){
shu++;
if(shu==m){
printf("%d ",v[i].next);
shu=0;
v[v[i].pre].to=v[i].to;
v[v[i].to].pre=v[i].pre;
times++;
if(times==n){
break;
}
}
}
return 0;
}