题目二:约瑟夫生者死者游戏

来源:互联网 发布:库卡焊接机器人编程 编辑:程序博客网 时间:2024/04/27 17:47
约瑟夫游戏的大意: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;} 


0 0
原创粉丝点击