数据结构的里约瑟夫环的一种简单有效的算法:
#include "stdio.h"
#include "stdlib.h"
struct circle
... {
int ID;
struct circle* next;
} ;
int main(int argc, char* argv[])
... {
int n,m,i;
scanf("%d %d", &n, &m);
struct circle* start=(struct circle*)malloc(sizeof(struct circle*));
struct circle* c; int person = n;
start->ID=1;
c=start;
for(i=1;i<=n;i++)
...{
c->next=(struct circle*)malloc(sizeof(struct circle*));
c->next->ID=i+1;
if(i==n)
c->next=start;
else
c=c->next;
}
while((c!=c->next))
...{
for(i=1;i<=m;i++)
...{
if(i==m)
...{
person--;
c->next=c->next->next;
}
else
...{
c=c->next;
}
}
}
do
...{
printf("%d ", c->ID);
c=c->next;
person--;
}
while(c!=c->next );
putchar('');
return 0;
}
#include "stdlib.h"
struct circle
... {
int ID;
struct circle* next;
} ;
int main(int argc, char* argv[])
... {
int n,m,i;
scanf("%d %d", &n, &m);
struct circle* start=(struct circle*)malloc(sizeof(struct circle*));
struct circle* c; int person = n;
start->ID=1;
c=start;
for(i=1;i<=n;i++)
...{
c->next=(struct circle*)malloc(sizeof(struct circle*));
c->next->ID=i+1;
if(i==n)
c->next=start;
else
c=c->next;
}
while((c!=c->next))
...{
for(i=1;i<=m;i++)
...{
if(i==m)
...{
person--;
c->next=c->next->next;
}
else
...{
c=c->next;
}
}
}
do
...{
printf("%d ", c->ID);
c=c->next;
person--;
}
while(c!=c->next );
putchar('');
return 0;
}
约瑟夫环所描述的是:
N个人围成一圈由1-N编队由1-M连续报数,当某人报到M时,该人出队,从下一个人开始由1-M继续报数,并不断重复此过程,直到所剩人数不足M时停止。