约瑟夫环

约瑟夫环

很老的问题了
这是问题描述
设有编号为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";


}

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

全部评论

相关推荐

牛客316659795号:不是,证明hr初筛已经过了,要投给部门筛一遍
点赞 评论 收藏
分享
牛客10001:问就是六个月,全国可飞,给钱就干
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务