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

题目描述

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

输入

测试数据有多组

每组包括3个数N、K、S,表示有N个人,从第S个人开始,数到K出列。(2 <= N <= 10^6,1 <= K <= 10,  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;
public:
    CNode()
    {
        next=NULL;
    }
    CNode(int n,CNode *p)
    {
        data=n;
        next=p;
    }
    int getdata()
    {
        return data;
    }
    CNode *getnext()
    {
        return next;
    }
    void setnext(CNode *p)
    {
        next=p;
    }
};
 
 
class CList
{
    friend class CNode;
    CNode *head;
    int nodenumber;
public:
    CList()
    {
        head=NULL;
        nodenumber=0;
    }
    ~CList()
    {
        delete head;
    }
    void nodeplus()
    {
        nodenumber++;
    }
    void nodeminus()
    {
        nodenumber--;
    }
    void createTailList(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->setnext(s);
            tail=s;
            nodeplus();
        }
        s=new CNode(num[i],head->getnext());
        tail->setnext(s);
        tail=s;
        nodeplus();
 
    }
    CNode *mybegin(int N,int S)
    {
        if(S<=0)
        S+=N;
        CNode *L=head->getnext();
        int i=1;
        while(i!=S)
        {
            L=L->getnext();
            i++;
        }
        return L;
    }
    void Josef(int N,int K,int S,CNode *L)///N个人,数到K出,L是从S开始时的指针
    {
        if(K==1)
        {
            CNode *p=L;
            int n=N-1;
            while(n--)
            {
                cout<<p->getdata()<<" ";
                p=p->getnext();
            }
            cout<<p->getdata()<<" "<<endl;
        }
        else
        {
            CNode *p=L;
            int count=1;
            while(p->getnext()!=p)
            {
                if(count==K-1)
                {
                    cout<<p->getnext()->getdata()<<" ";
                    p->setnext(p->getnext()->getnext());
                    p=p->getnext();
                    count=1;
                }
                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.createTailList(num,N);
        CNode *s=L.mybegin(N,S);
        L.Josef(N,K,S,s);
        delete []num;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/SZU-DS-wys/p/12177904.html
今日推荐