图解约瑟夫环(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