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

原创 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;

}

 

 

 

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

 

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

相关文章推荐

数据结构与算法学习笔记04(约瑟夫问题)

数据结构与算法学习笔记04(约瑟夫问题)   约瑟夫问题 据说著名犹太历史学家 Josephus有过以下的故事: 在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,...

约瑟夫问题

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

约瑟夫问题

约瑟夫问题本身好像挺简单,但它的变化形式有很多,各个问题又好像都有一些不一样,实在把人弄得头晕。先看看它的原型。参考百度上这个故事的来源:据说著名犹太历史学家 Josephus有过以下的故事:在罗马人...

约瑟夫问题

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

算法(一):Josephus问题

Josephus是一个著名的犹太历史学家,他有过这样的故事(来自互动百科,http://www.baike.com/wiki/Josephus):在罗马人占领乔塔帕特后,39个犹太人与Josephus...

java解答约瑟夫问题

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

约瑟夫问题

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

约瑟夫环问题的经典算法

  • 2010年11月15日 18:02
  • 1KB
  • 下载

C语言经典算法100例-069-简单约瑟夫环问题

这里我们实现一个简单的约瑟夫环问题,描述如下: 有N个人站成一圈,从

经典问题之约瑟夫问题的快速解决

此问题非常经典,在网上即可找到原题,在此不做描述。 对于原问题模型,一有链表法解决问题,效率极低,在此描述一种用树状数组完成问题的超快速做法。 首先,我们可以有这样递推的思路:不断加k模n,并减去其数...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:经典算法问题之约瑟夫问题
举报原因:
原因补充:

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