约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。
有个囚犯站成一个圆圈,准备处决。首先从一个人开始,越过
个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过
个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。
问题是,给定了和
,一开始要站在什么地方才能避免被处决? -- 引用自维基百科
问题有两种,一种是是上面维基百科的。怎么才能避免被干掉;另一种就是求出列人(或者编号)
#include<iostream >
#include<stdlib.h>
#include<stdio.h>
#define ERROR 0
typedef struct LNode{
int data;
struct LNode *link;
}LNode,*LinkList;
void josephus (int n,int k,int m)
{
LinkList p,r,list,curr;
p = (LinkList)malloc(sizeof(LNode));
p->data = 0;
p->link = p;
curr = p;//循环链表
for(int i = 1;i< n;i++){
LinkList t = (LinkList)malloc(sizeof(LNode));
t->data = i;
t->link = curr->link;//感觉用p,指向第一个节点,才是循环链表,这里为什么是 curr->link?
curr->link = t;
curr = t;
}
r = curr;
while (k--) r = p,p = p->link;//移动到报数开始位置 ,r和p 相邻
while(n--){//n控制轮数
for(int s = m-1;s--;r = p,p = p->link);//空循环,控制每次移动间隔
r->link = p->link;
printf("%d->",p->data);
free(p);//删除节点
p = r->link;
}
}
int main()
{
int n,k,m ;//第一个数为总人数,中间数为开始位置,最后一个数为间隔
scanf("%d,%d,%d",&n,&k,&m);
josephus (n,k,m);
}
参考:
1)https://zh.wikipedia.org/wiki/%E7%BA%A6%E7%91%9F%E5%A4%AB%E6%96%AF%E9%97%AE%E9%A2%98
2)http://www.cnblogs.com/EricYang/archive/2009/09/04/1560478.html