c++怎么实现约瑟夫问题?

老师布置了一个c++题目,只用数组实现约瑟夫问题?我该怎么实现呢?

数组实现约瑟夫问题的思想就是建立一个标记数组,未删除的人标记为0,否则为1,然后采用循环数组,对下标求余,具体实现如下,其中N为总人数,D为每次向下数的人数。
#include <iostream>
using namespace std;
void main(){
int N=40;//假设40个人
int a[100]={0};//最大支持100个人的标记,初始化为0
int D=6;//假设报数为6
int i=0;//循环变量
int j=-1;//当前的位置,初始化为-1,相当于一个虚拟的人
//输入我要的N和D
cout<<"请输入需要的N和D:"<<endl;
cin>>N>>D;
cout<<"结果显示如下:"<<endl;
for(i=0;i<40;i++){//循环40次,所有人均出来
int sum=0;//来记录数的人数
while(sum!=D){
j=(j+1)%40;
if(a[j]==0){
sum++;
}
}
a[j]=1;
cout<<j+1<<endl;//输出删除的位置
}
//最后输出来的就是最后剩下的人了
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-09-16

1、约瑟夫问题:
n个人(编号从1到n)围成一圈, 从第k(1≤k≤n)个人开始依次报数(从1开始), 第m个被杀掉, 然后再由下一个人重新报数, 直到所有人被杀, 依次显示被杀掉的人的编号。

2、例程:

#include<iostream>
#define MaxSize 50
#define ElemType int
using namespace std;
typedef struct                      //定义顺序表结构体类型
{
    ElemType data[MaxSize];         //存放每个人的编号
    int length;
}SqList;
void CreateList(SqList&L,int n)    //创建顺序表
{
    int i;
    for(i=0;i<n;i++)
         L.data[i]=i+1;           //编号为1~n L.Data[]
    L.length=n;                    //共n个人
}
void DispList(SqList L)            //显示顺序表中的记录
{
    cout<<"\n\n 幸存者的位置 :\n";
    for(int i=0;i<L.length;i++)
           cout<<L.data[i]<<"\t";
    cout<<endl;
}
int ListDelete(SqList&L,int i,ElemType &e)   //从顺序表中删除所选定的人的编号
{
    int j;
    if(i<1||i>L.length)
         return 0;
    i--;
    e=L.data[i];
    for(j=i;j<L.length-1;i++)
         L.data[j]=L.data[j+1];
    L.length--;
    return 1;
}
void Josephus(SqList&L,int m,int k)        //约瑟夫问题实现过程
{
    ElemType
    int i,n=0;                             //用n记录下标,下标从0开始
    cout<<"被杀者的位置 :\n";
    for(i=1;i<=k;i++)                      //将k个人抛入大海
    {
        for(int j=1;j<m;j++)               //每报数到m时,此人被扔入大海
        {
            n=n%L.length;
            n++;
        }
        ListDelete(L,n+1,e);               //位置=下标+1
        cout<<e<<'\t';
    }
}
int main(
{
    SqList sql;
    CreateList(sql,30);                    //将30人的编号存入顺序表
    Josephus(sql,9,15);                    //每数到第9个人就将他扔入大海,如此循环进
                                          //行,直到仅余15个人为止
    DispList(sql);                         //输出剩余的15人的位置
    return 0;
}

第2个回答  2011-04-27
这个问题其实就是要考虑怎么让数组形成一个循环,就像循环链表似地!你有邮箱吗?我发到你邮箱自己看吧!本回答被提问者采纳

利用C++应该怎么解决“约瑟夫问题”?
1、解决这道题可以采用模拟报数的方法,建立一个大小为N的数组,数组的第N个元素表示第N个人是否还在队伍中,首先将每个元素都置为1,表示全员都在队伍中。如果第N个人出队,则将第N个元素置为0。2、模拟报数可以使用一个累加计数器,用它表示这轮报数已有多少人报数,然后循环访问每个人,若其在...

求C++约瑟夫猴子选大王问题,要用数组与最基本的方法。必重谢!!!_百 ...
\/\/约瑟夫环---数组 #include <stdio.h>#include <stdlib.h>int main(){int* s=NULL;int result[50];int c=0;int i,n,m,p=0,count=0;while(1){scanf("%d",&n);scanf("%d",&m);if(n==0 && m==0){break;}if(s!=NULL){free(s);}s=(int*)malloc(sizeof(int)*n);fo...

约瑟夫问题
楼主先看这个代码,这是一个简单的约瑟夫问题的代码,用的c++,保存数据用的是数组,具体要修改的部分我接下来详细说明 首先,请定义一个简单数据结构用来代替上面的数组,这个我相信楼主你肯定会 其次,对于上面的输入输出,换成c语言 最后,特别需要说明的我都用注释的形式标注了 好了,代码百度搜索的...

约瑟夫生死问题C++
1,初始化for(j=i ; j>0 ; j--)的人数和for(int i=0 ; i<Y.Length(Y) ; i++)的长度不一致。2,for(int j = 0; j < 0; j ++) \/\/找出s结点 , 根本不会执行。

利用C++应该怎么解决“约瑟夫问题”?
1、解决这道题可以采用模拟报数的方法,建立一个大小为N的数组,数组的第N个元素表示第N个人是否还在队伍中,首先将每个元素都置为1,表示全员都在队伍中。如果第N个人出队,则将第N个元素置为0。2、模拟报数可以使用一个累加计数器,用它表示这轮报数已有多少人报数,然后循环访问每个人,若其在...

用C++编写约瑟夫环的代码,也就是出圈问题,n个人,数到k出圈,接着从1开 ...
include <iostream> using namespace std; int main() { int n,s,m; cout<<"please input the valuse of n,m,s"<<endl; cin>>n>>m>>s; if(n<=0||s<=0||m<=0) { cout<<"error"<<endl; } int i,j,k,temp;\/\/k为次数 int A[100]; for(i=0;i<n;i+...

C++编程:约瑟夫环问题。
\/\/ 约瑟夫环的头指针初始化为空 this->head = NULL;\/\/ 构造一个由 N 个犯人组成的约瑟夫环 for(int i=1;i<=N;i++){ \/\/ 当前添加的犯人是第一个犯人,要特殊处理一下 if(this->head == NULL){ \/\/ 新增一个犯人 p = new struct Prisoner();\/\/ 犯人编号 p -> id = i;\/\/ ...

关于数据结构 约瑟夫死亡游戏的代码C++
{ T data;LinkNode<T>*link;LinkNode( T item){ data=item;link=NULL;} };template<class T> class List { public:List() \/\/构造函数 { first=new LinkNode<T>;first->link=first;\/\/头尾相连,循环链表,用它可以让你数到最后一个人的时候,他的下一个人就是队伍的第一个家伙 } ...

约瑟夫问题
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被...

C++ 约瑟夫环问题
(1) 出圈游戏一:使用动态数组来接收输入,参加的人数和报数上限可变 (2) 出圈游戏二:使用循环链表来接受输入,参加的人数和报数上限可变 (3) 参加游戏者的编号和姓名存入文件play.txt中,按出圈顺序将出圈者的编号和姓名存入文件result.txt中。(4) 利用菜单提供用户界面,菜单格式如下:1. ...

相似回答