约瑟夫环问题描述:
约瑟夫环问题起源于一个犹太故事。问题大意如下:
罗马人攻占了乔塔帕特,41个人藏在一个山洞中躲过了这场浩劫。其中包括了Josephus和他的一个朋友。剩余39人不想屈服罗马人,决定集体自杀。大家决定了一个自杀方案,由41个人组成一个圆圈,第一个人开始顺时钟报数,报数为三的人就马上自杀,然后由下一个人重新开始报数,仍然报数为3就自杀。。。。。直到所有人都死亡
输出他们的自杀顺序
画图太难了,直接上代码,希望大家可以认真理解,错误之处还请指正,谢谢。
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int id;
struct node* next;
}Circle;
//创建初始链表
Circle* createCircle(int n)
{
Circle* circle=(Circle*)malloc(sizeof(Circle));
Circle* p=circle;
for(int i=1;i<=n;i++)
{
Circle* node=(Circle*)malloc(sizeof(Circle));
node->id=i;
node->next=NULL;
p->next=node;
p=p->next;
}
p->next=circle->next;
return circle;
}
//计算约瑟夫环
Circle* josephusCircle(int n,Circle *circle)
{
Circle* res=(Circle*)malloc(sizeof(Circle));
Circle* r=res;
Circle* p=circle;
Circle* q=p->next;
int count=0;
int jishu=0; //计数
while(count<n)
{
if(jishu>=3) jishu=1;
else jishu++;
if(jishu%3==0)
{
count++;
Circle* node=(Circle*)malloc(sizeof(Circle));
node->id=q->id;
node->next=NULL;
r->next=node;
r=r->next;
q=q->next;
p->next=q;
}
else
{
p=p->next;
q=q->next;
}
}
return res;
}
void main()
{
int n=41;
Circle* circle=josephusCircle(n,createCircle(n));
printf("下面的序号为原来的编号,而出现的先后顺序表示先后数到三的次序:\n");
for(int i=1;i<=41;i++)
{
printf("%d ",circle->next->id);
if(i%5==0) printf("\n");
circle=circle->next;
}
printf("\n");
free((void*)circle);
}
截图如下:
以上程序经过vc++6.0编译通过,运行成功。
希望大家一起学习,一起进步!