题目描述
n个人想玩残酷的死亡游戏,游戏规则如下:
n 个人进行编号,分别从 1 到 n,排成一个圈,顺时针从 1 开始数到 m,数到 m 的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
输入 n 和 m 值。m>1。
输出胜利者的编号。
样例输入
5 3
样例输出
4
提示
第一轮:3 被杀第二轮:1 被杀第三轮:5 被杀第四轮:2 被杀
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
};
//删除操作
void Del(struct node *head, int m)
{
struct node *p, *q;
int i = 1; //计数。
p = q = head;
while(p != NULL)
{
if(i == m)
{
//删除链表中元素。
q->next = p->next;
free(p);
p = q->next;
i = 1;
}
q = p;
p = p->next;
if(q == p)
{
//最后一个元素,按照题意应该输出。
printf("%d\n", p->data);
break;
}
i++;
}
}
int main()
{
int n, m;
while(scanf("%d %d", &n, &m) != EOF)
{
struct node *head = NULL;
struct node *p, *q;
//创建循环链表。head 为表头指针。
p = (struct node *)malloc(sizeof(struct node));
p->data = 1;
head = p;
for(int i = 2; i <= n; i++)
{
q = (struct node *)malloc(sizeof(struct node));
q->data = i;
p->next = q;
p = q;
}
p->next = head;
//创建完毕。
Del(head, m);
}
return 0;
}