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

约瑟夫游戏的大意: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;
} 


  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值