约瑟夫环

来源:互联网 发布:阿里云上海机房在哪里 编辑:程序博客网 时间:2024/05/20 06:55

约瑟夫环

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

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

运行结果

原创粉丝点击