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

    问题描述:约瑟夫环问题,古代一法官要判决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);
}
为啥不行呢?明天继续更新得到正确结果。。。

posted @ 2015-10-29 08:52  gendlee1991  阅读(57)  评论(0)    收藏  举报