约瑟夫游戏的大意:30 个游客同乘一条船,因为严重超载,
加上风浪大作,危险万分。因此船长告诉乘客,只有将全船
一半的旅客投入海中,其余人才能幸免于难。无奈,大家只
。
加上风浪大作,危险万分。因此船长告诉乘客,只有将全船
一半的旅客投入海中,其余人才能幸免于难。无奈,大家只
得同意这种办法,并议定 30 个人围成一圈,由第一个人数
起,依次报数,数到第 9 人,便把他投入大海中,然后再从
他的下一个人数起,数到第 9 人,再将他投入大海中,如此
循环地进行,直到剩下 15 个游客为止。问:哪些位置是将
被扔下大海的位置?
不失一般性,将 30 改为一个任意输入的正整数 n,而报数
上限(原为 9)也为一个任选的正整数 k
#include<stdio.h>
#include<string.h>
typedef struct {
int num[100]; // 数组保存各个人所在的位置
int die_num[100];// 保存该去掉的人
int size; // 船上还有的人数
int die_index;// 这时候去掉人的个数-1
int k; // 间隔K 个人 就该下船
int cur_p; // 算到的当前位置的
}people;
void init( people &n, int t, int k ){ // 初始化
n.size=t;
n.k=k;
n.die_index=0;
n.cur_p=0;
for( int i=0; i<t; ++i )
n.num[i]=i+1;
}
int get_next_die( people &n){ // 找到下一个下船的位置
int pos=n.cur_p;
int end=n.k;
for( int i=1; i<end; ++i )
{
pos=(pos+1)%n.size;
}
n.cur_p=pos;
return pos;
}
int put_out_person( people &n ){
int i=n.cur_p;
n.die_num[n.die_index]=n.num[i];
n.die_index+=1;
if( n.size<=0 )
return 0;
for( ; i < n.size; ++i )
n.num[i]=n.num[i+1];
n.size-=1;
return 1;
}
int save( people &n )
{
while( n.size > 15 )
{
get_next_die(n);
put_out_person(n);
}
return 1;
}
void print(people &n)
{
for( int i=0; i<n.die_index; ++i )
printf("%d ",n.die_num[i]);
printf("\n");
}
int main(){
people t;
int n,k;
scanf("%d%d",&n,&k);
init(t,n,k);
// printf("%d %d\n",t.size, t.k);
save(t);
print(t);
return 0;
}
。