其他分享
首页 > 其他分享> > 约瑟夫双向生死游戏

约瑟夫双向生死游戏

作者:互联网

说明

约瑟夫双向生死游戏是在约瑟夫生者死者游戏的基础上,正向计数后反向计数,然后再正向计数。具体描述如下:30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免遇难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人开始,顺时针依次报数,数到第9人,便把他投入大海中,然后从他的下一个人数起,逆时针数到第5人,将他投入大海,然后从他逆时针的下一个人数起,顺时针数到第9人,再将他投入大海,如此循环,直到剩下15个乘客为止。问哪些位置是将被扔下大海的位置。程序运行时可以输入任意的旅客,可以自己制定规则,输入顺时针扔第几个、逆时针扔第几个、从第几个开始扔,并按被扔的顺序显示扔下去的位置和最后幸存者的名单。

链表实现

设计思想

代码及运行

#include <iostream>  
using namespace std;  
int count=0;//链表的个数 
typedef struct node  
{  
    int number;  
    struct node *pre;  
    struct node *next;  
}node;  
node *pend; //头 
node *phead; //尾 
  
void Create_List()//创建链表;  
{
    node *ps=new node;  
    ps->next=NULL;  
    ps->pre=NULL;  
    cout<<"请输入船上的人,以零结束"<<endl;  
    cin>>ps->number;
    while(ps->number!=0)  
    {  
        if(!phead)//空表的插入;  
        {  
            phead=ps;  
            pend=ps;  
        }  
        else  
        {  
            pend->next=ps;  
            ps->pre=pend;  
            pend=ps;  
        }  
        ps=new node;
        ps->next=NULL;  
        ps->pre=NULL;  
        cin>>ps->number;
        count++;
    }
    pend->next=phead;//连接表头表尾;  
    phead->pre=pend;  
}  
void throw_list(int Cwise,int aCwise,int start,int die_num)
{
    int d=0;
    node *p=new node;
    p=phead;
    for(int i=1;i<start;i++)
    {
        p=phead->next;
    }
    while(d!=die_num)//扔人 
    {
        for(int i=1;i<Cwise;i++)
        {
            p=p->next;
        }
        if(phead->number==p->number)//保证头 
        phead=phead->next;
        else if(pend->number==p->number)
        pend=pend->pre;
        cout<<p->number<<"号 死亡"<<endl;
        p->next->pre=p->pre;
        p->pre->next=p->next;
        p=p->next;
        d++;
        if(d==die_num)
        break;
        for(int i=1;i<aCwise;i++)
        {
            p=p->pre;
        }
        if(phead->number==p->number)//保证头 
        phead=phead->next;
        else if(pend->number==p->number)
        pend=pend->pre;
        cout<<p->number<<"号 死亡"<<endl;
        p->next->pre=p->pre;
        p->pre->next=p->next;
        p=p->pre;
        d++;
        if(d==die_num)
        break;
    }
    cout<<"幸存者名单 "<<" ";//活的人 
    p=phead;
    for(int i=1;i<=count-d;i++)
    {
        cout<<p->number<<" ";
        p=p->next;
    }
    cout<<endl;
}
int main()
{
    int p_num,Cwise,aCwise,start,die_num;
    Create_List();
    cout<<"游戏开始"<<endl;
    cout<<"顺时针扔第几个 ";
    cin>>Cwise;
    cout<<"逆时针扔第几个 ";
    cin>>aCwise;
    cout<<"从谁开始扔 ";
    cin>>start;
    cout<<"扔几个 ";
    cin>>die_num;
    throw_list(Cwise,aCwise,start,die_num);
 }

顺序表实现

设计思想

代码及运行

#include<iostream>
using namespace std;
class list
{
    public:
        void List();
        int length()const;
        int get_element(const int i);
        int locate(const int x)const;
        void insert(const int i,const int x);
        void delete_element(const int i);
        void print();//打印 
    private:
        int data[100];
        int count;
 };
void list::List()
{
    count=0;
}
int list::length()const
{
    return count;
}
int list::get_element(const int i)
{
    return data[i-1];
}
int list::locate(const int x)const
{
    for(int i=0;i<length();i++)
    {
        if(data[i]==x)
        return i+1;
        else
        return -1;
    }
}
void list::insert(const int i,const int x)
{
    for(int j=count-1;j>=i-1;j--)
    {
        data[j+1]=data[j];
    }
    data[i-1]=x;
    count++;
}
void list::delete_element(const int i)
{
    for(int j=i+1;j<=length();j++)
    {
        data[j-2]=data[j-1];
    }
    count--;
}
void list::print()
{
    for(int i=0;i<length();i++)
    cout<<data[i]<<" ";
}
void play(list L,int number,int Cwise,int aCwise,int start,int die_num)//游戏 
{
    int d=0;
    int tag;//用来确定扔谁 
    L.List();
    for(int i=1;i<=number;i++)//人被安排在船上 
    L.insert(i,i);
    tag=start+Cwise-1;//开始扔人 
    while(d!=die_num)
    {
        cout<<L.get_element(tag)<<"号 死亡"<<endl;
        L.delete_element(tag);
        d++;
        if(d==die_num)
        break;
        tag=tag-aCwise+1;
        if(tag<1)
        tag=tag+number;
        cout<<L.get_element(tag)<<"号 死亡"<<endl;
        L.delete_element(tag);
        d++;
        if(d==die_num)
        break;
        tag=tag-1+Cwise-1;
        if(tag>L.length())
        tag=tag-L.length();
    }
    cout<<"幸存者 "<<endl;
    L.print();
}
int main()
{
    list L;
    int number,Cwise,aCwise,start,die_num;
    cout<<"游戏开始"<<endl;
    cout<<"船上有几个人 ";
    cin>>number;
    cout<<"顺时针扔第几个 ";
    cin>>Cwise;
    cout<<"逆时针扔第几个 ";
    cin>>aCwise;
    cout<<"从谁开始扔 ";
    cin>>start;
    cout<<"扔几个 ";
    cin>>die_num;
    play(L,number,Cwise,aCwise,start,die_num);
}

标签:pre,ps,结点,生死,int,number,约瑟夫,链表,双向
来源: https://www.cnblogs.com/Qi-Lin/p/12221279.html