ahixidnm 2022-05-31 15:20 采纳率: 100%
浏览 133
已结题

约瑟夫双向生死者游戏,怎么用学号姓名来命名这些旅客,并且输出死亡和活着旅客的学号姓名

#include
using namespace std;

//

class Node
{
friend class Doublelist;
friend void DoubleJoseph();

  public:
         Node();
         int data;
         Node *prior;
         Node *next;
   private:

};

//

class Doublelist
{
friend void DoubleJoseph();
public:
void Creatlist(Doublelist &L);
int getLength(Doublelist &L);
Doublelist();
private:
Node *Head;
};

//

Node::Node()
{
data = 0;
prior = NULL;
next = NULL;
}

//

Doublelist::Doublelist()
{
Head = NULL;
}

//

void Doublelist::Creatlist(Doublelist &L)
{
cout << "请输入双向生死游戏的总人数N:";
int n;
cin >> n;
Node *p,*s;
for(int i = 1;i <= n;i++)
{
p = new Node;
p->data = i;
p->next = NULL;
if(i == 1)
{
L.Head = p;
p->prior = NULL;
s = L.Head;
}
else
{
s->next = p;
p->prior = s;
s = s->next;
}
}
s->next = L.Head;
L.Head->prior = p;
}

//

int Doublelist::getLength(Doublelist &L)
{
Node *p = L.Head;
int count = 0;
while(p->next != L.Head)
{
count++;
p = p->next;
}
count++;
return count;
}

//

void DoubleJoseph()
{
Doublelist L;
L.Creatlist(L);

 cout << "请输入游戏开始的位置S:";
 int s;
 cin >> s;
 
 cout << "请输入正向的死亡数字M:";
 int m;
 cin >> m;
 
 cout << "请输入逆向的死亡数字W:";
 int w;
 cin >> w;
 
 cout << "请输入剩余的生者人数";
 int k;
 cin >> k;
 cout << endl;
 
 Node *p,*q,*r;
 p = L.Head;
 for(int i = 0;i < s-1;i++)
 {
         p = p->next;
 }
 int t = 1;
 while(k < L.getLength(L))
 {
      if(t%2)//选择游戏方式
      {
              //报数,寻找m结点 
             for(int j = 0; j < m-1; j++)
             {
                     q = p;
                     p = p->next;
             }
             //元素出列 
             if(p == L.Head)
             {
                     r = p;
                     L.Head = p->next;
                     q->next = p->next;
                     p->next->prior = q;
                     p = p->next;
             }
             else
             {
                 r = p;
                 q->next = p->next;
                 p->next->prior = q;
                 p = p->next;
             }
             cout << "第" << t <<"个死者的位置是:" << r->data << '\n';
             t++;
      }
      else
      {
          for(int j = 0;j < w - 1;j++)
          //报数,选择w结点 
          {
                           q = p;
                           p = p->prior;
          }
          //元素出列 
          if(p == L.Head)
          {
               r = p;
               L.Head = p->prior;
               q->prior = p->prior;
               p->prior->next = q;
               p = p->prior;
          }
          else
          {
              r = p;
              q->prior = p->prior;
              p->prior->next = q;
              p = p->prior;
          }
          cout << "第" << t << "个死者的位置是:" << r->data <<endl;
          t++;
      }
 }
 cout << '\n' << "最后剩下:" << '\t' <<L.getLength(L) << "人" << endl;
 cout << "剩余的生者位置为:" << '\t';
 p = L.Head;
 
 while(p->next != L.Head)
 {
               cout << p->data <<'\t';
               p = p->next;
 }
 if(p)
 cout << p->data << '\t';
 cout << '\n';

}
//

int main()
{
cout << "现有N人围成一圈,从第S个人开始依次报数,正向报M的人出局,再由下一人开始报数,";
cout << "逆时针数到的第W人出局。再从他逆时针的下一个人数起,顺时针数M人。";
cout << "如此循环,直到剩下K个乘客为止。"<< '\n' << '\n';

DoubleJoseph();

system("pause");
return 0;

}

  • 写回答

1条回答 默认 最新

  • HWsir 2022-05-31 16:24
    关注

    img


    这样?

    
    #include<iostream>
    #include<string>
    using namespace std;
    
    //
    
    class Node
    {
    friend class Doublelist;
    friend void DoubleJoseph();
    
      public:
             Node();
             int data;
             string name;
             Node *prior;
             Node *next;
       private:
    };
    
    //
    
    class Doublelist
    {
    friend void DoubleJoseph();
    public:
    void Creatlist(Doublelist &L);
    int getLength(Doublelist &L);
    Doublelist();
    private:
    Node *Head;
    };
    
    //
    
    Node::Node()
    {
    data = 0;
    prior = NULL;
    next = NULL;
    }
    
    //
    
    Doublelist::Doublelist()
    {
    Head = NULL;
    }
    
    //
    
    void Doublelist::Creatlist(Doublelist &L)
    {
    cout << "请输入双向生死游戏的总人数N:";
    int n;
    cin >> n;
    Node *p,*s;
    
    for(int i = 1;i <= n;i++)
    {
    p = new Node;
    p->data = i;
    cout<<"请输入"<<i<<"编号人的姓名";
    cin>>p->name;
    p->next = NULL;
    if(i == 1)
    {
    L.Head = p;
    p->prior = NULL;
    s = L.Head;
    }
    else
    {
    s->next = p;
    p->prior = s;
    s = s->next;
    }
    }
    s->next = L.Head;
    L.Head->prior = p;
    }
    
    //
    
    int Doublelist::getLength(Doublelist &L)
    {
    Node *p = L.Head;
    int count = 0;
    while(p->next != L.Head)
    {
    count++;
    p = p->next;
    }
    count++;
    return count;
    }
    
    //
    
    void DoubleJoseph()
    {
    Doublelist L;
    L.Creatlist(L);
    
     cout << "请输入游戏开始的位置S:";
     int s;
     cin >> s;
    
     cout << "请输入正向的死亡数字M:";
     int m;
     cin >> m;
    
     cout << "请输入逆向的死亡数字W:";
     int w;
     cin >> w;
    
     cout << "请输入剩余的生者人数";
     int k;
     cin >> k;
     cout << endl;
    
     Node *p,*q,*r;
     p = L.Head;
     for(int i = 0;i < s-1;i++)
     {
             p = p->next;
     }
     int t = 1;
     while(k < L.getLength(L))
     {
          if(t%2)//选择游戏方式
          {
                  //报数,寻找m结点
                 for(int j = 0; j < m-1; j++)
                 {
                         q = p;
                         p = p->next;
                 }
                 //元素出列
                 if(p == L.Head)
                 {
                         r = p;
                         L.Head = p->next;
                         q->next = p->next;
                         p->next->prior = q;
                         p = p->next;
                 }
                 else
                 {
                     r = p;
                     q->next = p->next;
                     p->next->prior = q;
                     p = p->next;
                 }
                 cout << "第" << t <<"个死者的位置是:" << r->data <<r->name<< '\n';
                 t++;
          }
          else
          {
              for(int j = 0;j < w - 1;j++)
              //报数,选择w结点
              {
                               q = p;
                               p = p->prior;
              }
              //元素出列
              if(p == L.Head)
              {
                   r = p;
                   L.Head = p->prior;
                   q->prior = p->prior;
                   p->prior->next = q;
                   p = p->prior;
              }
              else
              {
                  r = p;
                  q->prior = p->prior;
                  p->prior->next = q;
                  p = p->prior;
              }
              cout << "第" << t << "个死者的位置是:" << r->data <<"--"<<r->name<<endl;
              t++;
          }
     }
     cout << '\n' << "最后剩下:" << '\t' <<L.getLength(L) << "人" << endl;
     cout << "剩余的生者位置为:" << '\t';
     p = L.Head;
    
     while(p->next != L.Head)
     {
                   cout << p->data<<"--" <<p->name<<'\t';
                   p = p->next;
     }
     if(p)
     cout << p->data <<"--"<<p->name<< '\t';
     cout << '\n';
    }
    //
    
    int main()
    {
    cout << "现有N人围成一圈,从第S个人开始依次报数,正向报M的人出局,再由下一人开始报数,";
    cout << "逆时针数到的第W人出局。再从他逆时针的下一个人数起,顺时针数M人。";
    cout << "如此循环,直到剩下K个乘客为止。"<< '\n' << '\n';
    
    DoubleJoseph();
    
    system("pause");
    return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月8日
  • 已采纳回答 5月31日
  • 赞助了问题酬金10元 5月31日
  • 修改了问题 5月31日
  • 展开全部

悬赏问题

  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题