C++ - 顺序表实现Josephus问题

Josephus问题描述 :
     设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列、然后从出列的下一个人开始重新报数,数到第m的人又出列,如此反复直到所有人全部出列为止。

要求:对于任意给定的n、s、m,求出按出列次序得到的n个人员的序列。


/* 上机题1 - josephus问题 - 顺序表 */

#include <iostream>
const int Max = 100;
using namespace std;

template <class T>                                    //类模板 - 蓝图的蓝图 
class josephus
{
	private:
		int n, s, m;                                   //n - 游戏总人数、s - 从第s个人开始报数、 m - 游戏人数间隔 
		T all[Max], jose[Max];                         //all[] - 用来存放入序列顺序、jose[] - 用来存放出序列顺序 
		
	public:
		josephus()
		{
			cout << "请输入参与Josephus游戏的人数:";
        	        cin >> n;
	                cout << "请输入游戏从第几个人开始(编号):" ;
	                cin >> s;
	                cout << "请输入游戏间隔:" ;
	                cin >> m;
	        
	        for( int i = 0; i < n; i++ )           //编号 
	        {
	        	all[i] = i+1;
	        }
		}
		
		void disp_all()
		{
			for( int i = 0; i < n; i++ )
			{
				cout << all[i] << " ";
			}
			cout << endl;
		}
		
		void disp_jose()
		{
			for( int i = 0; i < n; i++ )
			{
				cout << jose[i] << " ";
			}
			cout << endl;
		}
		
		void play()
		{
			int jose_count = 0, jose_index = 0, k = 0;
	        s = s-1; 
	
        	while( jose_count < n )
        	{
	        	if( all[s] != 0 ) k++;
		
	          	if( k == m )
	        	{
		        	jose[jose_index] = all[s];
		    	    all[s] = 0;
		    	    jose_count++;
		    	    jose_index++;
		    	    k = 0;
	    	    }
	 	
		        s++;
		        if( s == n ) s = 0; 
     	    }
	    }
	    
} ;

int main()
{
	josephus<int> A;
	
	cout << "开始时人员序列号顺序:"; 
	A.disp_all();
	
	A.play();
	
	cout << "求解后的序列如下:";
	A.disp_jose();
	
	return 0;
}

后记:

最近在看一本书,是红衣教主周鸿祎写的《我的互联网方法论》,他讲到了互联网的本质——Free,没错,就是免费,Internet这条信息高速公路不仅仅需要哪些专业人士去建造,而且需要我们每一个人来贡献出一些东西,我们需要站在巨人的肩膀上去眺望未来,编程也是这样,不要刀耕火种,我们需要交流,相互交流,这也是我为什么要花我的一部分时间来写博客的原因,我所写的这些东西也许都是上个世纪的产物了,很多人都在写,但是我希望我们每个人都来写,因为分享知识从来都是一件令人快乐的事。



  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值