【洛谷P1996】约瑟夫问题

时间:2021-07-10 06:18:24

约瑟夫问题

链表模拟大概是正解

 #include<iostream>
using namespace std;
struct node{      //单链表
int d;
node *next;
};
int n,m;
node *head,*p,*r;
int main()
{
int i,j;
cin>>n>>m;
head=new node;
head->next=NULL;
head->d=;
r=head;
for(i=;i<=n;i++)  //插入1~n
{
p=new node;
p->d=i;
p->next=NULL;
r->next=p;
r=p;
}
r->next=head;    //循环链表
p=r;
for(i=;i<=n;i++)  //模拟
{
for(j=;j<m;j++) p=p->next;
cout<<p->next->d<<' ';
p->next=p->next->next;  //删去节点p->next
}
cout<<endl;
return ;
}

用数组乱搞:

 #include<iostream>
#include<cstdio>
using namespace std;
int n,m,a[],s,t=,p;
int main()
{
scanf("%d%d",&n,&m);
while(s!=n)  //s记录已经删去的人数
{
if(p==m)  //数到m个人
{
a[t]=;  //记录已经删去
p=;    //清空已经数的人数
cout<<t<<' ';
s++;
}
t=t%n+;  
if(!a[t]) p++;
}
return ;
}