【约瑟夫问题】约瑟夫相关问题(C语言)2)反Josephu环问题...

发布时间:2021-04-02 17:01:20

约瑟夫相关问题(C语言)2)反Josephu环问题反Josephu环问题为:设编号为1,2,… n的n个人围坐一圈,约定编号(1测试数据:当n=41,m=3,x=3时,k=14。(3)Josephu环问题的变形(p1012)设有编号为1,2,…,k-1,k,k+1,…,2k-1,2k(1=测试数据1:若k=3,则m=5。测试数据2:若k=4,则m=30。回答满意有分追加

网友回答

【答案】 反Josephu环问题
  #include
  #include
  typedef struct
  {
   struct T_LIST* pre;
   struct T_LIST* next;
  } T_LIST;
  T_LIST* GetPreOne(T_LIST* ThisOne, int m)
  {
   for (; m > 1; m--)
   {
   ThisOne = ThisOne->pre;
   }
   return ThisOne;
  }
  int main()
  {
   T_LIST* head, //当前
   * pLast,//最后一个人
   * tem, *tem2; //临时交换指针
   int n,//总人数
   m,//循环长度
   x,//最后人
   k,
   i;//当前人数
   printf(输入相关数据(n,m,x):\n);
   scanf(%d,%d,%d, &n, &m, &x);
   pLast = malloc(sizeof(T_LIST));
   head = malloc(sizeof(T_LIST));
   head->pre = head->next = pLast;
   pLast->pre = pLast->next = head;
   printf(n=%d,m=%d,x=%d\n,n,m,x);
   i = 2;
   for (; i pre;//临时指针指向前一个节点
   head->pre = tem2 = malloc(sizeof(T_LIST)); //建立前一局被淘汰者,并构建本局数1的人pre
   tem->next = head->pre;//临时节点修复
   tem2->next = head;//上局淘汰者next修复
   tem2->pre = tem;//上局淘汰者pre修复
   head = head->pre;//指向被淘汰者,准备下轮循环
   }
   //脱离循环后head指向第一个被淘汰者
   //调用GetPreOne,是head指向数1的人
   head = GetPreOne(head, m);
   while (1)
   {
   if (pLast == head)
   {
   break;
   }
   pLast = pLast->next;
   x++;
   }
   k = x % n ;
   if(k==0)
   k=41;
   printf(k = %d\n, k);
   //收尾,释放内存
   while(pLast->next != head)
   {
   pLast = pLast->next;
   free(pLast->pre);
   }
   free(pLast);
   free(head);
   return 0;
  }
  =============================================
  Josephu环问题的变形(p1012)
  #include
  #include
  int fun(char* data, int k, int m);
  int main()
  {
   int k, m;
   char* data;
   printf(Please input k:\n);
   scanf(%d, &k);
   data = malloc(2 * k);
   for (m = k + 1;; m++)
   {
   if (fun(data, k, m))
   break;
   }
   printf(m=%d\n, m);
   free(data);
   return 0;
  }
  int fun(char* data, int k, int m)
  {
   int i = 0, //数数时的位置
   j = 0, //已经杀死的人数
   t = 0; //数数时的累加器
   for (; i
以上问题属网友观点,不代表本站立场,仅供参考!