约瑟夫环(循环链表)

题目描述

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

用循环链表实现约瑟夫环。

输入

输入多组测试数据,每组测试数据格式如下:

人数n(>0) 开始位置k(>0) 报数m(>0)

输出

对每组测试数据,输出出圈顺序。

样例输入

3 1 2

5 3 3

样例输出

2 1 3

5 3 2 4 1 

代码实现:

方法一:

#include<bits/stdc++.h>

using namespace std;

struct lian{

    int num;

    lian *next;

};

lian *head;

lian *create(int n)

{

    head=NULL;

    int i;

    lian *ps,*pend;

    pend=NULL;

    for(i=1;i<=n;i++)

    {

        ps=new lian;

        ps->num=i;

        if(head==NULL)

            head=ps;

        else

            pend->next=ps;

        pend=ps;

    }

    pend->next=head;

    return head;

}

void jose(int n,int k,int m,lian *head)

{

    int count=0,x=0;

    lian *nowloc,*temp,*h=head;

    while(1)

    {

        if(h->next==head)

            break;

        h=h->next;  

    }

    while(1)

    {

        x++;

        if(x==k)//开始位置的前一个

        {

            nowloc=h;

            break

        }

        h=h->next;

    }

    count=0;

    int total=0;

    while(1)

    {

        if(total==n-1)

            break;

        count++;

        if(count%m==0)

        {

            total++;

            cout<<nowloc->next->num<<" ";

            temp=nowloc->next;

            nowloc->next=nowloc->next->next;

            delete temp;

        }

        else

            nowloc=nowloc->next;        

    }

    cout<<nowloc->num<<endl;

}

int main()

{

    lian *h;

    int n,k,m;//人数,开始位置,报数

    while(cin>>n>>k>>m)

    {  

        h=create(n);

        jose(n,k,m,h);

    }

    return 0;

 }

方法二:

#include<bits/stdc++.h>

using namespace std;

struct List

{

    int num;

    List *next;

};

int main()

{

    int N,S,K,i,j;

    while(cin>>N)

    {

        cin>>K>>S;

        List *mylist=new List[N];

        List *now=mylist;

        //构成链表,编号

        int go_out=0;

        for(i=1;i<=N;i++)

        {

            now->next=mylist+i%N;

            now->num=i;

            now=now->next;

        }

        //

        List *piv;//哨兵

        if(S==1)

            now=&mylist[N-1];

        else

            now=&mylist[S-2];

        while(now->next!=now)

        {

            for(j=0;j<K;j++)

            {

                piv=now;

                now=piv->next;

            }

            cout<<now->num<<" ";

            piv->next=now->next;

            now=piv;

        }

        cout<<now->num<<" "<<endl;

        delete []mylist;

    }

     

    return 0;

}

猜你喜欢

转载自blog.csdn.net/forTiffanyY/article/details/79701186