黑色星空
欢迎你,注册进来让我们共同打造这片星空吧。。。。。。

by: niusan521

Join the forum, it's quick and easy

黑色星空
欢迎你,注册进来让我们共同打造这片星空吧。。。。。。

by: niusan521
黑色星空
Would you like to react to this message? Create an account in a few clicks or log in to continue.

已知n个人围坐一圈,数到m的人出列,最后剩下的是谁?

向下

已知n个人围坐一圈,数到m的人出列,最后剩下的是谁? Empty 已知n个人围坐一圈,数到m的人出列,最后剩下的是谁?

帖子  niusan521 周日 十二月 23, 2012 1:30 am

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三个正整数,来求出列的序列。这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。 p->link=head
  解决问题的核心步骤:(程序的基本算法)
  1.建立一个具有n个链结点,无头结点的循环链表;
  2.确定第1个报数人的位置;
  3.不断地从链表中删除链结点,直到链表为空。
  void JOSEPHUS(int n,int k,int m) //n为总人数,k为第一个开始报数的人,m为出列者喊到的数
  {
  
  LinkList p,r,list;
  for(int i=0;i<n;i++)
  {
  p=(LinkList)malloc(sizeof(LNode));
  p->data=i;
  if(list==NULL)
  list=p;
  else
  r->link=p;
  r=p;
  }
  p->link=list;
  p=list; 
  
  for(i=0;i<k;i++)
  {
  r=p;
  p=p->link;
  }
  
  while(p->link!=p)
  {
  for(i=0;i<m-1;i++)
  {
  r=p;
  p=p->link;
  }
  r->link=p->link;
  printf("被删除的元素:M ",p->data);
  free(p);
  p=r->link;
  }
  printf("\n最后被删除的元素是:M",P->data);
  }


C语言模拟 约瑟夫环
  #include <stdio.h>
  #define M 10
  #define N 5
  #define START 0
  void main(void)
  {
  int a[M],i=0,k,count=0;
  while(i++<M)
  a[i-1]=i;
  for(i=START;count<=M-1;count++)
  {
  for(k=1;k<=N;a[i++]&&++k)
  if(i>M-1)
  i=0;
  printf("%d ",i?a[i-1]:a[M-1]);
  a[(i?(i-1):(M-1))]=0;
  }
  getch();
  }
niusan521
niusan521

帖子数 : 210
注册日期 : 12-01-09

返回页首 向下

返回页首


 
您在这个论坛的权限:
不能在这个论坛回复主题