经典算法问题之约瑟夫问题

原创 2012年03月31日 15:42:42

/*
  据说著名犹太历史学家 Josephus有过以下的故事:
  在罗马人占领乔塔帕特后,
  39 个犹太人与Josephus及他的朋友躲到一个洞中,
  39个犹太人决定宁愿死也不要被敌人抓到,
  于是决定了一个自杀方式,41个人排成一个圆圈,
  由第1个人开始报数,
  每报数到第3人该人就必须自杀,
  然后再由下一个重新报数,直到所有人都自杀身亡为止。
  然而Josephus 和他的朋友并不想遵从,
  Josephus要他的朋友先假装遵从,
  他将朋友与自己安排在第16个与第31个位置,
  于是逃过了这场死亡游戏。


  这里我们用循环链表来实现

*/

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


struct Node;//声明节点
typedef struct Node *PtrToNode;
typedef PtrToNode Position;
typedef PtrToNode Head;
typedef PtrToNode List;


//节点定义
struct Node{
 int No;//编号
 char name[10];//名称
 Position next;
};

 


/*建立链表*/
List createLink(int num)
{

 Head head = NULL,p = NULL,q = NULL;
 int i=1;
 char name[10];

 head = (Position)malloc(sizeof(struct Node));//建立头节点 
 head->No = 1;
 p=head;

 printf("请输入第1个人名称: \n");
 scanf("%s",name);
 strcpy(p->name,name);

 

 for(i=2;i<=num;i++)
 {
  q = (Position)malloc(sizeof(struct Node));
  if(q==0)return 0;

  p->next = q;
  p = q;
  p->No = i;

  printf("请输入第%d个人名称: \n",i);
  scanf("%s",&name);
  strcpy(p->name,name);
 }
 p->next = head;//让最后一个节点的指针指回头结点
 return head;//将头节点返回
}


/*建立约瑟夫环,num表示人数,n表示每n个删掉一个*/
void jose(Position p,int num,int n)
{
 int i,j = 0;
 Position q = NULL;
 for(i = 1;i<=num;i++)
 {
  
   //找到要被删除节点的上一个节点保存在p中
   for(j=1;j<n-1;j++)
   {
    p = p->next;
   }

   q = p->next;//将需要删除的节点暂时保存在q中,此时p表示要删除节点的上一个节点
   
   //将p->next(要删除的节点)从链表中删除
   p->next = q->next;
   p = p->next;
   printf("第%3d个出圈的是:%3d,name is %s\n",i,q->No,q->name);
   free(q);//释放所占内存空间
  
  printf("\n");

 }
}

 

 

 

int main()
{
 Head head = createLink(15);
 jose(head,15,4);
 system("PAUSE");
 
return 1;

}

 

 

 

//执行效果如下图所示:

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

约瑟夫问题(Josephus Problem)3:谁最后一个出列

版权所有。所有权利保留。 欢迎转载,转载时请注明出处: 本文是论述约瑟夫问题的第三部分,约瑟夫问题的描述在第一部分。请先阅读第一部分。 现在要求输出最后一个出列的人的编号。 第一次见到这个问题是在我高...

约瑟夫问题(经典问题)

约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.) 问题来源: 据说著名犹太历史学家 Josephus有...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

经典算法问题之约瑟夫问题

/*   据说著名犹太历史学家 Josephus有过以下的故事:   在罗马人占领乔塔帕特后,   39 个犹太人与Josephus及他的朋友躲到一个洞中,   39个犹太人决定宁愿死也不要被...

算法总结——约瑟夫问题

问题描述 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个...

算法题-约瑟夫(Joseph)问题求解

题:编写一个程序,求解约瑟夫(Joseph)问题。有n个小孩围城一圈,将他们从1开始依次编号,从编号为1的小孩开始报数,数到第m个小孩出列,然后从出列的下一个小孩重新开始报数,数到第m个小孩有出列,如...

BZOJ 3191 JLOI2013 卡牌游戏

约瑟夫问题,重标号
  • Fuxey
  • Fuxey
  • 2016-04-29 17:13
  • 726

约瑟夫问题

约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.) 问题由来: 据说著名犹太历史学家 Josep...

约瑟夫问题

首先是经典的约瑟夫问题的解法 #include #include #include   using namespace std;   /*  *  * 典型的约瑟夫问题...
  • ydmgr
  • ydmgr
  • 2013-12-23 22:28
  • 396

约瑟夫问题

约瑟夫问题(Josephus problem)又称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,约瑟夫问题类似问题又称为约瑟夫环、“丢手绢问题”。 据说著名犹太历史学家...

约瑟夫问题(单链表)

#include #include struct student{ int id; struct student * next; }; struct student * tailCreat...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)