您的位置:首页 > 其它

约瑟夫问题 链表解

2012-02-10 17:05 155 查看

题目描述

n个人想玩残酷的死亡游戏,游戏规则如下:

n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。

请输出最后一个人的编号。

输入

输入n和m值。

输出

输出胜利者的编号。

示例输入

5 3


示例输出

4


提示

第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀

#include<iostream.h>
#include<malloc.h>
struct mon
{
int num;
struct mon *next;
};
struct mon *creat(int n)
{
int i;
struct mon *head,*p,*tail;
p = (struct mon *)malloc(sizeof(struct mon));
p->num = 1;
p->next = NULL;
head = p;
tail = p;
for(i = 2 ; i <= n ;i++)
{
p = (struct mon *)malloc(sizeof(struct mon));
p->num = i;
tail->next = p;
tail = p;
p->next = NULL;
}
tail->next = head;
return head;
}
int sel(struct mon *head,int m, int n)
{
int count = 0,i = 0;
struct mon *p,*q;
q = head;
while(q->next!=head)
{
q = q->next;
}
while(count<n-1)
{
p = q->next ;
i++;
if(i%m == 0)
{
q->next = p->next;
free(p);
count++;
}
else
q = p;
}
return q->num;
}
int main()
{
int n,m;
struct mon *head;
cin>>n>>m;
head = creat(n);
cout<<sel(head,m,n)<<endl;
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: