问题描述:n 只猴子要选大王,选举办法如下:所有猴子按1,2……n 编号围成一圈,从第一号开始顺序 1,2……m, 凡是报 m 号的退出圈外,如此循环报数直到圈内只剩一只猴子时这只猴子就是大王。
思路:属于约瑟夫环问题,利用单向循环链表模拟此过程,输出选出的大王编号。
#include<iostream>
#include<windows.h>
using namespace std;
const int n = 18, m = 4;
typedef struct monkey{
int num;
struct monkey *next;
};
void main(){
system("mode con:cols=100 lines=100");
monkey *p, *head, *q;
int i;
head = q = new monkey;
q->num = 1;
for (i = 2; i <= n; ++i){
p = new monkey;
q->next = p;
p->num = i;
q=p;
}
q->next = head;
p = head;
i = 0;
while (1){
++i;
cout << p->num << "号猴子报:" <<i<<endl;
if (p->next == p) break;
if (i == m){
i = 0;
cout << p->num << "号猴子被淘汰" << "-------" << p->num << endl;
q->next = p->next;
p = q->next;
}
else{
if (i == m - 1) q = p;
p = p->next;
}
}
cout << p->num << "号猴子为大王!";
cin.get();
}