约瑟夫问题(环形链表解题)

来源:互联网 发布:淘宝上亚马逊会员代买 编辑:程序博客网 时间:2024/05/29 14:00

约瑟夫问题

Time Limit: 1000MS Memory Limit: 65536KB

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 <iostream>using namespace std;struct node{    int date;    node *next;}*head;int n;void creat(){    node *p,*tail;    head->next=NULL;    tail=head;    for(int i=1;i<=n;i++)    {        p=new node;        p->next=NULL;        p->date=i;        tail->next=p;        tail=tail->next;    }    tail->next=head->next;}int m;void Game(){    node *p=head;    node *q=head->next;node *r;    for(int k=0;k<4;k++)    {        for(int i=0;i<m-1;i++)        {            p=p->next;            q=q->next;r=q;        }        p->next=q->next;q=q->next;}    cout<<p->next->date<<endl;}int main(){    head=new node;    cin>>n;    creat();    cin>>m;if(m==1) {cout<<n<<endl;return 0;}    Game();    return 0;}