首页 > 其他 > 详细

DS循环链表—约瑟夫环 (Ver. I - B)

时间:2020-01-10 20:48:19      阅读:132      评论:0      收藏:0      [点我收藏+]

题目描述

N个人坐成一个圆环(编号为1 - N),从第S个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
例如:N = 3,K = 2,S = 1。2号先出列,然后是1号,最后剩下的是3号。

测试数据有多组,

每组包括3个数N、K、S,表示有N个人,从编号为S的人开始,数到K出列。

输入

测试数据有多组

每组包括3个数N、K、S,表示有N个人,从第S个人开始,数到K出列。(2 <= N <= 10^3,10^3 < K <= 10^9,  1 <= S <= N)

输出

出列的人的编号

样例输入

13 3 1 3 2 1

样例输出

3 6 9 12 2 7 11 4 10 5 1 8 13 2 1 3

提示

#include<iostream>
using namespace std;
#define ok 0
#define error -1
class CNode
{
    int data;
    CNode *next;
    CNode *before;
public:
    CNode()
    {
        next=NULL;
        before=NULL;
    }
    CNode(int n,CNode *p,CNode *q)
    {
        data=n;
        next=p;
        before=q;
    }
    int getdata()
    {
        return data;
    }
    CNode *getnext()
    {
        return next;
    }
    CNode *getbefore()
    {
        return before;
    }
    void setnext(CNode *p)
    {
        next=p;
    }
    void setbefore(CNode *q)
    {
        before=q;
    }
};
 
 
class CList
{
    friend class CNode;
    CNode *head;
    int nodenumber;
public:
    CList()
    {
        head=NULL;
        nodenumber=0;
    }
    ~CList()
    {
        delete head;
    }
    void createdoubleTailList(int *num,int n)
    {
        CNode *tail;
        CNode *s;
        head=new CNode();
        tail=head;
        int i;
        for(i=0;i<n-1;i++)
        {
            s=new CNode(num[i],NULL,tail);
            tail->setnext(s);
            tail=s;
            nodenumber++;
        }
        s=new CNode(num[i],head->getnext(),tail);
        tail->setnext(s);
        head->getnext()->setbefore(s);
        tail=s;
        nodenumber++;
 
    }
    CNode *mybegin(int N,int S)
    {
        CNode *L=head->getnext();
        int i=1;
        while(i!=S)
        {
            L=L->getnext();
            i++;
        }
        return L;
    }
    void Josef(int N,int K,CNode *L)///N个人,数到K出,L是从S开始时的指针
    {
        int n=N;///一会拿来等N的
        CNode *p=L;
        int count=1;
        while(n>1)
        {
            int k=K;
            if(k%n!=0)
                k%=n;
            else
                k=n;
            if(count==k)
            {
                cout<<p->getdata()<<" ";
                p->getbefore()->setnext(p->getnext());
                p->getnext()->setbefore(p->getbefore());
                p=p->getnext();
                count=1;
                n--;
            }
            else
            {
                count++;
                p=p->getnext();
            }
        }
        cout<<p->getdata()<<" "<<endl;
    }
};
 
int main()
{
    int N,K,S;///N个人,数到K出列,从S开始
    while(cin>>N>>K>>S)
    {
        int *num=new int[N];
        for(int i=0;i<N;i++)
            num[i]=i+1;
        CList L;
        L.createdoubleTailList(num,N);
        CNode *s=L.mybegin(N,S);
        L.Josef(N,K,s);
        delete []num;
    }
    return 0;
}

DS循环链表—约瑟夫环 (Ver. I - B)

原文:https://www.cnblogs.com/SZU-DS-wys/p/12177930.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!