c--约瑟夫环

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 
 7 
 8 //解决约瑟夫环问题
 9 //分别使用数组和链表
10 //问题描述:n只猴子围成一个圈选大王,从1开始数m个数,
11 //          第m个猴子淘汰,然后下一只猴子从1开始重新数,
12 //          最后剩下一只猴子为猴子大王,输出是几号猴子
13 //1、数组
14 /*
15 int main(){
16     int n,m;
17     cout<<"请输入n只猴子和数字m"<<endl;
18     cin>>n>>m;
19     int a[n];
20     //0表示未被淘汰,1表示被淘汰
21     memset(a,0,sizeof(a));
22     int cnt=1;//用来计数淘汰了几只
23     int j=n-1;
24     while(cnt<n){//淘汰n-1只猴子
25         int k=0;//计数,用来记录猴子报的数
26         do{
27             j=(j+1) % n;//计算报数m的猴子的位置
28             if(a[j]!=1){//未被淘汰,计数器+1;
29                 k++;
30             }
31         }while(k < m);
32         a[j]=1;
33         cnt++;
34         cout<<"淘汰:"<<j+1<<endl;
35     }
36 
37     //遍历找出最后一只猴子,注意数组下标+1是猴子的序号
38     for(int i=0;i<n;i++){
39         if(a[i]==0){
40             cout<<"猴子大王是:"<<i+1<<"号"<<endl;
41             return 0;
42         }
43     }
44 }
45 */
46 
47 
48 //2、链表
49 
50 typedef struct node{
51     int num;
52     node *next;
53 }node;
54 
55 
56 int main(){
57     node *head =NULL;
58     node *tial;
59     int n,m;
60     cout<<"请输入n只猴子和数字m"<<endl;
61     cin>>n>>m;
62     for(int i=0;i<n;i++){
63         node* s=(node*)malloc(sizeof(node));
64         s->num=i+1;
65         if(i==0) head=s;
66         else tial->next=s;
67         tial=s;
68     }
69     tial->next=head;
70     int cnt=1;
71     node* p=tial;
72     while(cnt<n){
73         //p指向目标的前一个
74         for(int i=1;i<m;i++){
75             p=p->next;
76         }
77         node *q=p->next;
78         p->next=q->next;
79         free(q);
80         cnt++;
81     }
82     cout<<"猴子王:"<<p->num<<endl;
83 }

猜你喜欢

转载自www.cnblogs.com/yasina/p/12812981.html