Josephus约瑟夫环问题

来源:互联网 发布:linux如何建立软链接 编辑:程序博客网 时间:2024/04/28 22:46

求解Josephus问题:设有n个数构成一个环链,现从第k个数开始数数,数到m的那个数被弹出,然后从该数的下一个数重新开始数数,数到m的那个数又被弹出,如此重复,直到所有的数均被弹出为止。输出这些数弹出的序列。

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct Node {
 int no;
 int m;
 struct Node *next;
} Node, *LinkList;

LinkList Creat(int m, int n, int mm[])
{
 LinkList L;
 int i;
 Node *r,*s;
 L=(LinkList)malloc(sizeof(Node));
 r=L;
 for (i=0; i<n; i++)
 {
  s=(Node *)malloc(sizeof(Node));
  if (s==NULL)
  {
   printf("错误:内存不足!/n");
   return NULL;
  }
  s->no=i+1;
  s->m=mm[i];
  r->next=s;
  r=s;
 }
 L->no=0;
 L->m=0;
 r->next=L;
 return L;
}

void Josephus(LinkList L, int m, int n)
{
 int i,j,nn=n;
 Node *p,*q;
 p=L;
 for (i=0;i<n;i++)
 {
  if (m<2) m=m+nn;
  for (j=0;j<m-2;j++)
  {
   if (p->no==0) p=p->next;
   p=p->next;
  }
  q=p->next;
  if (q->no==0) q=q->next;
  m=q->m;
  printf("%4d",q->no);
  p->next=q->next;
  free(q);
  nn--;
  p=p->next;
 }
}

main()
{
 int m,n,i,mm[MAXSIZE]/*={3,1,7,2,4,8,4}*/;
 int ch=0, c;
 LinkList L;
/* m=20;n=7;
 Only For Test*/
 printf("输入m:");scanf("%d",&m);
 printf("输入n:");scanf("%d",&n);
 printf("输入密码:");
 for (i=0;i<n;i++)
  scanf("%d",&mm[i]);
 L=Creat(m,n,mm);
 printf("得到序列如下:/n");
 Josephus(L,m,n);
 printf("/n");
 return 0;
}

原创粉丝点击