图解约瑟夫环(C语言实现)

本文通过图解介绍如何使用C语言实现约瑟夫环问题。描述了游戏规则,即从特定编号开始,数到M的人出列,然后从下一个人开始重新计数,直到所有人出列。示例中,8名玩家围成一圈,从3号玩家开始,数到3的人出列。文章探讨了如何利用数组和循环模拟游戏过程,并提供了实现思路。
摘要由CSDN通过智能技术生成

图解约瑟夫环(C语言实现)

场景描述:
1、一群人围在一起坐成环状;

2、从某个编号的人开始报数;

3、数到 M 的时候,此人出列,他的下一个人又从1开始报数,数到 M 的那个人又出列;

4、一直循环,直到所有人出列,约瑟夫环结束。

这里假设有 8 个人围成了环状,依次标号为 1 至 8。
在这里插入图片描述
假设游戏从 3 号玩家开始,规定每次从 1 开始计数,数到 3 的人出列,出列的玩家变为红色,未出列玩家仍用绿色表示。
在这里插入图片描述
5号玩家出列后,6号玩家重新开始叫数,此时 8 号玩家出列。
在这里插入图片描述
依次循环直至所有玩家出列。
在这里插入图片描述
此时的出列顺序为:
在这里插入图片描述
上述的“游戏规则”如何使用程序语言来描述呢?对于该问题有下述思考过程。

1、每一轮中当所有的玩家都已经叫完数时,要紧接着开始新的一轮叫数,使用数组来存储玩家状态时,需要模拟成环从而允许游戏一轮一轮按顺序执行下去,直到最后一人出列。此时参加游戏的玩家一共 8 人,可以通过取模while循环的方式实现该操作。

假设 index 表示此时轮到第 index 个人叫数,
每叫一次数,index++,表示轮到下一个人,
即使 index>8,也可以通过模8运算,将 index 限定在 0-7 以内。

在while循环内进行游戏,
定义一个 out_arr[] 数组用于存放出列的玩家,
并通过计数变量统计出列玩家的数量,
直至 计数变量=玩家数量 时结束循环,游戏结束。

2、第一轮中所有的玩家都未出列,此时可以通过 index++ 的方式找到每个出列的玩家,但从第二轮游戏开始,每次叫数需要忽略已出列玩家。

while out_arr[] ≠ player
	if in_arr[index%player]0
		寻找下个不为零的下标
		指定玩家出列
		index = 
	else if in_arr[index
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值