约瑟夫问题
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
n个人想玩残酷的死亡游戏,游戏规则如下:
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
输入
输入n和m值。
输出
输出胜利者的编号。
示例输入
5 3
示例输出
4
提示
第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀
#include <stdio.h>
#include <stdlib.h>
{
LNode *next;
LNode *prior;
int data;
} LNode,*linklist;
linklist CreateList(LNode *L,int h){
LNode *p,*q,*tail; int i;
L=(linklist)malloc(sizeof(LNode));
L->next=NULL;
tail=L;
for(i=0;i<h;i++){
p=(linklist )malloc(sizeof(LNode));
p->data=i+1;
p->next=NULL;
tail->next=p;
tail=p;
if(i==h-1) tail->next=L->next; //当创建结束时要讲尾指针指向头结点,形成循环链表
}return L;
}
linklist Joseph(linklist L,int h,int k)
{
int i;
linklist p,q;
q=L->next;
p=L;
while(q->next!=q){
for(i=0;i<k;i++){
if(i==k-1){
p->next=q->next; //不停循环,知道剩下一个节点为止
free(q); //每循环k次都将此节点删除q=p->next;
}else{
p=p->next;
q=q->next;
}
}
}
printf("%d",q->data);
}
int main()
{
int n,m,i;
linklist l,p,q;
scanf("%d%d",&n,&m);
l=CreateList(l,n);
Joseph(l,n,m);
}