Problem Description
n个人想玩残酷的死亡游戏,游戏规则如下:
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
Input
输入n和m值。
Output
输出胜利者的编号。
Example Input
5 3
Example Output
4
Hint
第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀
代码
//约瑟夫问题,利用尾插法建立循环链表
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *next;
}NODE;
int main()
{
NODE *L=(NODE*)malloc(sizeof(NODE)),*p,*s;
L->next=NULL;
int n,m,i;
scanf("%d%d",&n,&m);
p=L;
for(i=1;i<=n;i++)//尾插法建立循环链表
{
s=(NODE*)malloc(sizeof(NODE));
s->data=i;
p->next=s;
p=s;
}
p->next=L->next;//让最后一个链表的下一节点指向开头
p=L->next;
free(L);
while(p->next!=p)//开始模拟(判断条件要注意:因为最后肯定剩下一个人,所以最后一个数据的指针域还是它本身)
{
for(i=1;i<m-1;i++)//注意点k-1
{
p=p->next;
}
p->next=p->next->next;//数到m的人被杀,并将这一节点从链表中删除
p=p->next;
}
printf("%d\n",p->data);
return 0;
}