约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。
有个囚犯站成一个圆圈,准备处决。首先从一个人开始,越过
个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过
个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。
问题是,给定了和
,一开始要站在什么地方才能避免被处决?
比较简单的做法是用循环单链表模拟整个过程,时间复杂度是O(n*m)。代码如下:
typedef struct node {
int data;
struct node *next;
} LNode, *LinkList;
//构建循环链表
LinkList Init(int n){
LinkList p,r;
LinkList list = NULL;
int i;
for(i=0;i < n;i++) {
p = (LinkList)malloc(sizeof(LNode));
p->data = i+1;
p->next = NULL;
if(!list) {
list = p;
} else {
r->next = p;
}
r = p;
}
p->next = list;
return list;
}
void joseph2(LinkList root,int n,int m){
int flag,i = 1;
LinkList pre,p;
pre = p = root;
flag = 0;
while(1){