一群猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1——m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,然后继续从1开始,这样依次下来,直到圈中只剩下一只猴子,则该猴子为大王。
一群猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1——m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,然后继续从1开始,这样依次下来,直到圈中只剩下一只猴子,则该猴子为大王。
我这里有一个程序(不过不是很完善D):
///////////////////////////头文件////////////////
typedef struct member
{
int ID;//某个人的序号
int cipher;//密码
member *next;//下一个
}Person;
typedef struct
{
Person *head;//链表头
Person *tail;//链表尾
int lenth;//链表长
}List;
///////////// 算法部分 ( .cpp 文件)////////////
//添加链表元素
void AddMember(List &list,int ID,int cipher)
{
Person *per = (Person *)malloc(sizeof(Person));
per->ID = ID;
per->cipher = cipher;
//当链表为空时
if(list.lenth == 0)
{
list.head = per;
list.tail = per;
per->next = list.head;
}
else //当链表不空时
{
per->next = list.head;
list.tail->next = per;
list.tail = per;
}
list.lenth++;
}
//用来记录输出结果的数组 初始化
void InitArray(int lenth, int **array)
{
*array = (int *)malloc(lenth * sizeof(int));
}
//处理链表(排序)
void DoList(List list, int *array)
{
int N = list.lenth;//用于循环
int arrayCount = 0;//输出数组的下标
int cip;
Person *person = list.head;
cip = person->cipher;
while(N > 0)
{
for(int i = 1; i < cip; i++)//找出下一个出列的人
person = person->next;
Person *p = person->next;
cip = p->cipher;
array[arrayCount] = p->ID;
arrayCount++;
person->next = p->next;
free(p);
N--;
}
}
//////////////main 函数部分(.cpp 文件)/////////////
#include <iostream.h>
#include <malloc.h>
#include <stdlib.h>
#include "test2.h"
#include "algo2.cpp"
void main()
{
int max, n;
int cipher;
List list;
char loop;//循环的标志
do
{
cout<<"*************** 约瑟夫环问题 ****************"<<endl<<endl;
do
{
cout<<"输入密码的最大值: ";
cin>>max;
cout<<endl<<"输入人数: ";
cin>>n;
if(max <= 0 || n <= 0)
cout<<"你所输入的数不能小于 1,请重新输入"<<endl;
}
while(max <= 0 || n <= 0);
list.lenth = 0;
for(int i = 1; i <= n; i++)
{
cout<<"输入第 "<<i<<" 个人的密码(必须大于0): ";
do
{
cin>>cipher;
if(cipher > max)
cout<<"你所输入的数大于密码的最大值,请从新输入:"<<endl;
if(cipher <= 0)
cout<<"你所输入的数小于 1,请从新输入:"<<endl;
}
while(cipher > max || cipher <= 0);
AddMember(list, i, cipher);//添加成员
}
int *array;
InitArray(n, &array);//数组初始化
DoList(list, array);//按顺序删除成员
cout<<endl<<"************* 出列顺序为 ***************"<<endl;
for(i = 1; i <= n; i++)//输出出列顺序
{
if(i%20 == 0)
cout<<endl;
cout<<array[i-1]<<" ";
}
cout<<endl<<"是否要继续?(Y / N)"<<endl;
cin>>loop;
system("cls");//清屏幕
}
while(loop == 'Y' || loop == 'y');
}
呵呵, 挺有趣的!^_^