求大神用C语言写约瑟夫双向生死问题,不要用C++
在自杀模式下,41人组成一个圈,第1人开始数,每数到第三个人,这个人就必须自杀。
然后下一个人再数,直到所有人都自杀。
然而,约瑟夫斯和他的朋友们不想服从。约瑟夫斯要求他的朋友先假装服从,他安排他的朋友和自己在一起。
在16和31位置,躲过了死亡游戏。
解约瑟夫斯问题可以用代数分析法求解,拓展了问题。假设你现在不幸和M个朋友扯上了关系。
有了这个游戏,你如何保护自己和朋友?画两个圈就可以让自己和朋友免于死亡。
玩,这两个圈的内圈是排列顺序,外圈是自杀顺序,如下图所示:
如果用程序解决问题,只需要把数组当成一个环。在数组中,你从1开始计数,每找到三个。
如果没有数据区,填充一个计数,直到计数达到41,然后从索引1开始列出数组,就可以知道每
一个位置的自杀顺序,也就是约瑟夫排列,如下:41人和约切夫排列的报数3:
14 36 1 38 15 2 24 30 3 16 34 4 25 17 5 40 31 6 18 26 7 37 19 8 35 27 9 20 32 10 41 21 11 28 39 12
22 33 13 29 23
从上面可以看出,最后一次自杀是在31位置,而倒数第二次自杀是在16位置,之前。
所有人都死了,所以他们不知道乔切夫和他的朋友们没有遵守游戏规则。
# include & ltstdio.h & gt
# include & ltstdlib.h & gt
#定义N 41
#定义M 3
int main(void) {
int man[N]= { 0 };
int count = 1;
int i = 0,pos =-1;
int alive = 0;
while(count & lt;= N) {
做{
pos =(pos+1)% N;//戒指治疗
if(man[pos] == 0)
i++;
If(i == M) {//报告数为3。
I = 0;
打破;
}
} while(1);
man[pos] =计数;
count++;
}
Printf ("\ nJocheff排列:");
for(I = 0;我& ltn;i++)
printf("%d ",man[I]);
printf(" \ n \ n您想救多少人?");
scanf("%d ",& amp活着);
Printf("\nL表示应该放置%d人的位置:\n ",活着);
for(I = 0;我& ltn;i++) {
if(man[I]& gt;活着)
printf(" D ");
其他
printf(" L ");
if((i+1) % 5 == 0) printf("
");
}
printf(" \ n ");
返回0;}