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 }