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

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

}

 

 

 

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

 

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

同一个世界 两世之约 禁忌 攻略

同一个世界 两世之约 禁忌 攻略
  • nameofcsdn
  • nameofcsdn
  • 2017年04月03日 01:51
  • 3376

同一个世界 两世之约 命运 攻略

同一个世界 两世之约 命运 攻略
  • nameofcsdn
  • nameofcsdn
  • 2017年04月03日 01:54
  • 2186

同一个世界 两世之约 白之门 攻略

同一个世界 两世之约 白之门 攻略
  • nameofcsdn
  • nameofcsdn
  • 2017年04月03日 01:50
  • 2041

同一个世界 两世之约 虚空 攻略

同一个世界 两世之约 虚空 攻略
  • nameofcsdn
  • nameofcsdn
  • 2017年04月03日 01:51
  • 3589

同一个世界 两世之约 顺意 攻略

同一个世界 两世之约 顺意 攻略
  • nameofcsdn
  • nameofcsdn
  • 2017年04月03日 01:52
  • 2381

同一个世界 两世之约 道路 攻略

同一个世界 两世之约 道路 攻略
  • nameofcsdn
  • nameofcsdn
  • 2017年04月03日 01:52
  • 2815

简述P问题,NP问题,NPC问题以及NP Hard问题

发现我们经常谈到NP问题,NP完全问题,NP难问题,但是其实他们之间是有区别的。 1、P问题是指:一个问题可以找到一个能在多项式的时间里解决它的算法。也就是复杂度为O(1),O(log(n)),O(n...
  • John159151
  • John159151
  • 2015年10月11日 21:52
  • 1755

回溯算法--装载问题

回溯法 1、有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。 2、回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。...
  • sinat_24436879
  • sinat_24436879
  • 2015年04月10日 22:05
  • 2690

背包问题,硬币问题

至少有4种背包问题:1)01背包,
  • binling
  • binling
  • 2014年10月02日 14:36
  • 563

什么是P问题、NP问题和NPC问题

这或许是众多OIer最大的误区之一。     你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。你要知道,大多数人此时所说的NP问题其实都是指的N...
  • sinat_25357975
  • sinat_25357975
  • 2016年04月16日 12:00
  • 597
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:经典算法问题之约瑟夫问题
举报原因:
原因补充:

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