关于数据结构,在大学本科并未接触,目前才开始接触学习。
关于这个问题,还记得刚刚毕业那会,找工作面试的时候,有一家公司的笔试大题就是约夫瑟斯数据环,然而当时并未接触这个,所以,悲剧了
其实这个很简单,基本上学习了数据结构 之后必然会这个,可谓是数据结构入门的经典之作!
问题描述:
经典Josephus问题:
有n个人围坐有个圆桌,从第s个开始报数,报到m的人出列,然后从出列的下一个人继续报数,直到所有人都出列。
对于给定的任意n,s,m,求按次序出列的n个人的序列。
知识储备:线性表(顺序表,单链表,双链表,循环链表)
顺序表解法:
#define Maxnum 100
#define FALSE 0
#define TRUE 1
typedef int DataType;
void josephus_seq(PSeqList palist,int s,int m)
{
int s1,i,w;
s1=s-1;
for(i=palist->n;i>0;i--)
{
s1=(s1+m-1)%i;
w=palist->element[s1]; //求出下标为S1的元素的值
printf("Out element!"); //元素出列
delete_seq(palist,s1); //删除出列的元素
}
}
main()
{
PSeqList jos_alist;
int i,k,n,s,m;
printf("\n please input the value(<100)of n =");
scanf("%d",&n);
printf("please input the values of s=");
scanf("%d",&s);
printf("please input the values of m=");
scanf("%d",&m);
jos_alist=createNullList_seq(n); //创建新的空顺序表
if (jos_alist!=Null)
{
for(i=0;i<n;i++) //线性表赋值
insertpre_seq(jos_alist,i,i+1);
insertpre_seq(jos_alist,s,m);
free(jos_alist->element);
free(jos_alist);
}
}
约夫瑟斯数据环问题就到这了,后续还将继续学习数据结构,陆续更新ING;
Thanks for your reading.