Josephus问题
http://hi.baidu.com/yishugao/item/97c88c8bdd4ec058850fab55
问题描述:设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人开始报数,数到m的人又出列,如此重复,直到所有的人全部出列。Josephus问题是:对于任意给定的n,m,s,求出按出列次序得到的n个人员的顺序表。
输入:n,s,m。
输出:开始时n个人员的序列,按Josephus的方式后n个人员的序列。
存储结构:链式存储结构。
算法基本思想:建立单循环链表,然后对循环链表进行删除,使链表形成一新的循环链表,依次输出删除的元素。
#include "stdio.h"
#include "conio.h"
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*Linklist;
josephus(int n,int s,int m){
Linklist p,q,list;
int i;
list=NULL;
for(i=1;i<=n;i++)
{p=(Linklist)malloc(sizeof(LNode));
p->data=i;
printf("%d ",p->data);
if(list==NULL) {list=p;q=p;}
else q->next=p;
q=p;
}
printf("\n");
p->next=list;
p=list;
for(i=1;i<s;i++)
{q=p;p=p->next;}
while(p->next!=p)
{for(i=1;i<=m-1;i++)
{q=p;p=p->next;}
q->next=p->next;
printf("%d ",p->data);
free(p);
p=q->next;
}
printf("%d",p->data);
}
main()
{ int n,s,m;
printf("n,s,m=");
scanf("%d,%d,%d",&n,&s,&m);
printf("%d,%d,%d\n",n,s,m);
josephus(n,s,m);
getch();
}