数据结构与算法经典
1、约瑟夫环
问题描述:
假设有n个人站成一圈,每个人都有不同的编号i(1<=i<=n),从编号为1的人开始顺时针方向“1,2,3,4….m”循
环报数,数到m的人出列。然后从出列者的下一个人重新开始按报数,数到m的人再出列,如此重复进行,直
到n个人都出列为止。对于任意给定的n个人原始排列顺序和m值,输出n个人的出列顺序。
解题思路:
1、现在假设参与人数为:n=8;指定出列数:m=4;
那么第一个出列的数为:4 . . .
2、数组结构示意图:
3、设出列元素的下标为t,初始值为:t=0,可以得到一个规律:
t=(t+m-1)%n=(0+4-1)%8=3;
那么数组下标为3的人出列。出列一个元素之后,数组的规模:n-1;然后出列位置后面的元素向前移动。
c语言代码实现为:
#include<stdio.h>
#define MAXSIZE 10 //定义数组规模
typedef struct{
int a[MAXSIZE+1];
int n;
}sqlist; //创建结构体,然后一个成员为数组,一个成员为人数n。并且重命名为sqlist
void main(){ //main方法,为c程序段主入口
sqlist l;
int a;
print