您的位置:首页 > 其它

0010用顺序表实现约瑟夫环(Josephus)问题

2015-10-29 08:52 941 查看
问题描述:约瑟夫环问题,古代一法官要判决n个犯人的死刑,他的荒唐处决办法是,将犯人站成一圈,从第s个人开始数数,数到第d个人,就拉出来处决,然后再数d个,数到的人再处决,一直这样下去,最后的一个人得以幸免。那么当n=5(顺时针递增编号),s=1,d=2时,从编号1开始计数,最后幸免的编号是多少。

解题思路:1)先建立一个具有n个元素的顺序表对象ring1。

2)从第s个数据开始,依次计数,每数到d,就将该元素位置处置空。

3)重复上一步骤,依次选中n-1个数据元素出环。

4)输出所剩的最后一个数据元素。

5)本算法并没有采用直接的删除操作,而是置空操作,即赋值0,计数时跳过值为空的数据元素。

#include "SeqList.h"
#include<iostream>
using namespace std;

//编写一个实现函数
void display(int n,int s,int d)
{
SeqList ring1(n);    //初始化顺序列表ring1
ring1.create(n);
cout<<"ring:\t";
ring1.output();
int i,j,k;
i=s-1;
k=n;
while (k>1)
{
j=0;
while (j<d)
{
i=i%n+1;
if(ring1.get(i)!=0)
j++;
}
cout<<"out :   "<<ring1.get(i)<<"\t";
ring1.set(i,0);
k--;
cout<<"ring:\t";
ring1.output();
}
i=1;
while(i<=n&&ring1.get(i)==0)   //寻找最后一人
i++;
cout<<"The final person is "<<ring1.get(i)<<"\n";

}

void main(void)
{

display(5,1,2);
}
为啥不行呢?明天继续更新得到正确结果。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: