求解约舍夫问题:n只猴子选大王,报到m退出。
#include <stdio.h>
#define MaxSize 50
void jose(int n,int m)
{
int mon[MaxSize]; /*存放n个猴子的编号*/
int i,d,count;
for (i=0;i<n;i++) /*设置猴子的编号*/
mon[i]=i+1;
printf("出队前:"); /*输出出列前的编号*/
for (i=0;i<n;i++)
printf("%d ",mon[i]);
printf("\n");
printf("出队后:");
count=0; /*记录退出圈外的猴子个数*/
i=-1; /*从0号位置的猴子开始计数*/
while (count<n)
{
d=0;
while (d<m) /*累计m个猴子*/
{
i=(i+1)%n;
if (mon[i]!=0)
d++;
}
printf("%d ",mon[i]); /*猴子出列*/
mon[i]=0;
count++; /*出列数增1*/
}
printf("\n");
}
void main()
{
int m,n;
printf("输入猴子个数n,m:");
scanf("%d%d",&n,&m);
jose(n,m);
}
链表实现:
#include <iostream>
using namespace std;
typedef struct node
{
int data;
struct node * next;
}Node;
Node *head = new Node;
Node *p = head,*q = head, *s = head;
void InitNode(int m)
{
head -> next = NULL;
head -> data = 1;
for(int i = 1; i < m; i++)
{
Node *t =new Node ; //申请节点空间并赋值
t -> next = NULL;
t -> data = i+1;
p -> next = t;
p = t;
}
p -> next = head; //不带头节点的 循环单链表
p = head;
}
void Printf()
{
while(p -> next != head) //输出节点值
{
cout << p -> data << " ";
p = p -> next;
}
cout << p -> data << endl; //最后一个节点的数据 在此输出
}
void Jose(int m, int n)
{
int count = 0; //计数器置零
int member = n; //数到n 出局
while(q -> next != q)
{
if(count == member - 1)
{
s -> next = q -> next;
p = q;
q = q -> next;
cout << p -> data <<" "; //输出出局的号码
delete p;
p = NULL;
count = 0; //计数器重新置零
}
count++;
s = q;
q = q -> next;
}
cout << "最后的大王: " << q -> data << endl;
}
int main(void)
{
int m,n;
cout<<"输入游戏人数m和退出数n:";
cin >>m >> n ;
InitNode(m); //初始化队列
Printf();
Jose(m,n); //约舍夫问题
system("pause");
return 0;
}