约瑟夫环

约瑟夫环

很老的问题了
这是问题描述
设有编号为1,2,…,n的n(n>0)个人围成一个圈,每个人持有一个密码m。从第一个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。
基本要求
 建立模型,确定存储结构。
 对任意n个人,密码为m,实现约瑟夫环问题。
 出圈的顺序可以依次输出,也可以用一个数组存储。
呃 大致就是这样了
这是代码

#include<iostream>
using namespace std;
struct mod
{
    mod* next;
    int num;
};
//结构体的定义,数据结构,个人感觉就是为了处理问题方便来设置的物理上的实体,就是把抽象的问题用具体的模型来代替.在这里就是一个链条,一个接一个连着,好像是一群人手拉手,num代表着这个人的姓名,next就代表着彼此间拉着的手。
void handinhand(int n,mod*p)
{
    for(int i=0;i<n;i++)
    {
        p[i].next=&p[i+1];
    }
    p[n-1].next=&p[0];

}
mod *baoshu(int m,mod*b)
{
    int i=0,num=1;
    mod*odd=b;
    mod*now=b->next;
    while(num!=m)
    {
        num++;
        odd=now;
        now=now->next;
    }
    return odd;
}
void chuju(mod*ood,int i,int last)
{        mod*l=ood;
    cout<<"--------在第"<<i<<"轮游戏中---------\n"
        <<ood->next->num<<"玩家 出局\n";
        ood->next=ood->next->next;
    for(int i=1;i<last;i++)
    {

      cout<<l->num<<" ";
      l=l->next;
    }
    cout<<"活着\n";


}
int main()
{
    int n,m,i1,i=1;
    mod*odd;
    int last;
      cout<<"有几个人参加\n";
      while(!(cin>>n)||n<=0)
    {
        cin.clear();
        while(cin.get()!='\n')
            continue;
          cout<<" W R O N G \n"<<"请输入一个大于0的整数\n";
    }


      cout<<"密码是\n";
      while(!(cin>>m)||m<0)
    {
        cin.clear();
        while(cin.get()!='\n')
            continue;
          cout<<" W R O N G \n"<<"请输入一个大于0的整数\n";
    }

    mod p[n];
    last=n;

    for(i1=1;i1<=n;i1++)
      p[i1-1].num=i1;

    handinhand(n,p);

    odd=p[n-2].next;//初始化 从第一个人开始

    while(last>1)
    {

        odd=baoshu(m,odd);
        chuju(odd,i,last);

        i++;
        last--;
    }
    cout<<"------------------gameover-------------\n";


}

大致来说就是蛮简单的
运行了一下

运行结果

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术工厂 设计师:CSDN官方博客 返回首页
评论

打赏作者

银-TaMa

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值