约瑟夫问题

约瑟夫问题:

#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int status;
typedef int ElemType;

typedef struct CList{
   ElemType location;
   ElemType code;
   struct CList *next;
}CList,*ListPtr;

status InitList(ListPtr *CL);
status ReadList(ListPtr CL);
status Joseph(ListPtr CL);

void main(){
ListPtr L=NULL;
int cmd=0;

printf("******************************************************************\n");
printf("*     InitList--1      ReadList--2      Joseph--3     Exit--0    *\n");
printf("* Enter a operation code : 1, 2, 3, 0                            *\n");
printf("******************************************************************\n");

printf("\n------------------------------------------------------------------\n");
printf("\nOperation:");
scanf("%d",&cmd);

while(cmd!=0){
   switch(cmd){
      case 1:
         InitList(&L);
         break;
      case 2:
         ReadList(L);
         break;
      case 3:
         Joseph(L);
         break;
      }
   printf("\n\n------------------------------------------------------------------\n\n");
   printf("Operation:");
   scanf("%d",&cmd);
  }

}  

status InitList(ListPtr *CL){
   int count=0;
   int size=0;
   int cd=0;
   ListPtr p=NULL;
   ListPtr q=NULL;
   ListPtr r=NULL;

   printf("\nPlease enter the total numbers of people(1--32767):");
   scanf("%d",&size);
   if(size<1||size>32767){
      printf("Please check number(1--32767).\n");
      return ERROR;
      }
    else {
      q=malloc(sizeof(CList));
      if(!q)
         exit(OVERFLOW);
      count=1;
      p=q;
      p->location=count;

      do{
         printf("\nPlease enter NO.%d person's code:",count);
         scanf("%d",&cd);
         if(cd<1||cd>32767)
            printf("\nIncorrect data,Try again.\n");
      }while(cd<1||cd>32767);

      p->code=cd;

      while(size>1)
      {
         r=malloc(sizeof(CList));
         if(!r)
            exit(OVERFLOW);
         r->location=++count;

         do{
            printf("\nPlease enter NO.%d person's code:",count);
            scanf("%d",&cd);
            if(cd<1||cd>32767)
               printf("Incorrect data,try again.\n");
         }while(cd<1||cd>32767);

         r->code=cd;
         q->next=r;
         q=r;
         size--;
      }

      *CL=q;
      q->next=p;

      return OK;
    }
}

status ReadList(ListPtr CL){
   int count=0;
   ListPtr p=NULL;

   if(!CL)
      return ERROR;
   else{
      p=CL->next;
      printf("\n[People:");
      printf("%d",p->location);
      printf("Code:%d]",p->code);
      p=p->next;

      while(p!=CL->next){
         count++;
         if(count%3==0)
            printf("\n");
         else
            printf("\t");
         printf("[People:");
         printf("%d",p->location);
         printf("Code:%d]",p->code);
         p=p->next;
        }
   return OK;
   }
}

status Joseph(ListPtr CL){
   int n=0;
   int BeginNum=0;
   ListPtr p=NULL;
   ListPtr q=NULL;

   if(!CL)
      return ERROR;
   else {

      do{
         printf("\nPlease enter the begin number(1--32767):");
         scanf("%d",&BeginNum);
      if(BeginNum<1||BeginNum>32767)
         printf("\nIncorrect data,Try again.\n");
      }while(BeginNum<1||BeginNum>32767);

      p=CL;

      printf("\n-----------------The Output List is:-----------------------\n");

      while(p!=p->next){
         for(n=1;n<=BeginNum-1;n++)
            p=p->next;

         q=p->next;
         printf("%d  ",q->location);
         BeginNum=q->code;
         p->next=q->next;
         free(q);
        }
      printf("%d  ",p->location);
      return OK;
     }
}
时间: 2024-09-20 14:25:06

约瑟夫问题的相关文章

约瑟夫环的问题

题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为JOBDU的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一个数m,让编号为1的小朋友开始报数.每次喊到m的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续1...m报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到JOBDU名贵的"名侦探柯南"典藏版

约瑟夫环问题求解算法C语言源代码

约瑟夫算法:n个人围成一圈,每人有一个各不相同的编号,选择一个人作为 起点,然后顺时针从1到k数数,每数到k的人退出圈子,圈子缩小,然后从下一 个人继续从1到k数数,重复上面过程.求最后推出圈子的那个人原来的编号. 思路:按照上面的算法让人退出圈子,直到有n-1个人推出圈子,然后得到最 后一个退出圈子的人的编号. 程序:坐成一圈的人的编号不需要按序排列 #define N 100 int yuesefu1(int data[],int sum,int k) { int i=0,j=0,count

UVa 10940 Throwing cards away II:约瑟夫问题

10940 - Throwing cards away II Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=show_problem&problem=1881 Given is an ordered deck of n cards numbered 1 to n with card 1 at th

常用算法:C#约瑟夫环问题

约瑟夫环问题,即设有n个人坐成一个圈,从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人再出列,如此循环,直到所有人都出列为止.最后按出列顺序输出.代码如下: //从第start人开始计数,以alter为单位循环记数出列,总人数为total public int[] Jose(int total, int start,int alter) { int j, k = 0; //count数组存储按出列顺序的数据,以当结果返回 int[] count = new int[

php约瑟夫问题解决关于处死犯人的算法

 这篇文章主要介绍了php约瑟夫问题解决关于处死犯人的算法,实例分析了php关于约瑟夫问题的实现与应用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php约瑟夫问题解决关于处死犯人的算法.分享给大家供大家参考.具体分析如下: 古代某法官要判决IV个犯人的死刑,他有一条荒唐的法律将犯人站成一个圆圈,从第s个人开始数起,每到第D个人就拉出来处死,然后再数D个,再拉出来处决-- 直到剩下最后一个可以赦免. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14

php实现约瑟夫问题的方法小结

 这篇文章主要介绍了php实现约瑟夫问题的方法,实例总结了两种常见的实现约瑟夫问题的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例总结了php实现约瑟夫问题的方法.分享给大家供大家参考.具体分析如下: 一群猴子排成一圈,按1,2,...,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把它踢出去...,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王.要求编程模拟此过程,输入m.n, 输出最后那个大王的编号. 解

python超简单解决约瑟夫环问题

  本文实例讲述了python超简单解决约瑟夫环问题的方法.分享给大家供大家参考.具体分析如下: 约瑟环问题大家都熟悉.题目是这样的.一共有三十个人,从1-30依次编号.每次隔9个人就踢出去一个人.求踢出的前十五个人的号码: 明显的约瑟夫环问题,python实现代码如下: ? 1 2 3 4 5 6 a = [ x for x in range(1,31) ] #生成编号 del_number = 8 #该删除的编号 for i in range(15): print a[del_number]

JavaScript使用指针操作实现约瑟夫问题实例

 实现之前当然要自己来编写一些 JS 数组内部指针的操作函数,就像:reset(), current(), next(), prev(), search(), end() 这些函数,我们都要来自己实现,因为 JS 没有内置这些神奇的操作函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

php解决约瑟夫环示例

 这篇文章主要介绍了php解决约瑟夫环示例,需要的朋友可以参考下 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称"丢手绢问题".)   猴子一群,都带着号码的,站好了一圈,数到m的枪毙,剩下的接着数.如此往复,死剩下的一个就疯了    代码如下: <?php function killMonkeys($monkeys, $m){     $k = $m;     while (count($monkey

方法-循环列表求解约瑟夫环游戏用C++

问题描述 循环列表求解约瑟夫环游戏用C++ 简单的循环链表求解约瑟夫环游戏,传说有30个旅客同城做一条船,因为严重超载,加上风浪大作,危险万分.因此船长告诉大家,只有将乘客一半入海中,其他的人才能幸免遇难.无奈,大家只好同意这种方法,并议定30个人围成一圈,由第一个数起,依次报数,数到第九人,便把他扔入大海,然后再从他的下一个人数起,数到第九人,再将他扔入大海,如此循环地进行,直到剩下15个乘客为止.问那些位置将是被扔下大海.,将30个改为任意输入的正整数N,报数上限也改为一个任意的正整数k.