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这条信息高速公路不仅仅需要哪些专业人士去建造,而且需要我们每一个人来贡献出一些东西,我们需要站在巨人的肩膀上去眺望未来,编程也是这样,不要刀耕火种,我们需要交流,相互交流,这也是我为什么要花我的一部分时间来写博客的原因,我所写的这些东西也许都是上个世纪的产物了,很多人都在写,但是我希望我们每个人都来写,因为分享知识从来都是一件令人快乐的事。