【洛谷P1996】约瑟夫问题

约瑟夫问题

 

链表模拟大概是正解

 

 1 #include<iostream>
 2 using namespace std;
 3 struct node{      //单链表
 4     int d;
 5     node *next;
 6 };
 7 int n,m;
 8 node *head,*p,*r;
 9 int main()
10 {
11     int i,j;
12     cin>>n>>m;
13     head=new node;
14     head->next=NULL;
15     head->d=1;
16     r=head;
17     for(i=2;i<=n;i++)  //插入1~n
18     {
19         p=new node;
20         p->d=i;
21         p->next=NULL;
22         r->next=p;
23         r=p;
24     }
25     r->next=head;    //循环链表
26     p=r;
27     for(i=1;i<=n;i++)  //模拟
28     {
29         for(j=1;j<m;j++) p=p->next;
30         cout<<p->next->d<<' ';
31         p->next=p->next->next;  //删去节点p->next
32     }
33     cout<<endl;
34     return 0;
35 }

 

 

用数组乱搞:

 

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int n,m,a[105],s,t=0,p;
 5 int main()
 6 {
 7     scanf("%d%d",&n,&m);
 8     while(s!=n)  //s记录已经删去的人数
 9     {
10         if(p==m)  //数到m个人
11         {
12             a[t]=1;  //记录已经删去
13             p=0;    //清空已经数的人数
14             cout<<t<<' ';
15             s++;
16         }
17         t=t%n+1;  
18         if(!a[t]) p++;
19     }
20     return 0;
21 }     
22         

 

posted @ 2018-03-05 18:44  yjk  阅读(245)  评论(0)    收藏  举报