ゲームのルール:サークルに参加Diushouフアン、開始した後、時計回り方向に応じて、任意の一人(ゲームが自由に指定することができますが、アルゴリズムは1イニシエータデフォルトです)、最初の人Countinからスタート(報告されたルールの数:1つの増分がオフカウントから)次の番号を報告し続けて参加者の数の大きさが報告さならば、3の倍数がゲームの外で、他の人が最後の人までプレイし続けます。(反射ランダムに複数のイニシエータとを実行することをゲームを楽しまゲームの数は、念のアルゴリズムが運命づけられてきた勝者を作るそれによれば、ゆっくりとしかバグの出現場合(ゲームは、通常のを楽しみにしてできるのを待っているの勝者、ゲームの楽しさと、おそらくの追加(ゲームのルールを変更するには固定され、技術革新です))。
コードは、として(15人は、すぐに3の倍数を報告した人々の数をゲームに参加したと仮定して)、次のとおりです。
/*
算法核心分析:
每当一个人报数后,并且他不退出时,他下次报出的数目等于他当前报出的数目加上还在进行游戏的人数.
*/
#include <iostream>
using std::endl;
using std::cout;
int* gamers;
//展示每一轮开始之前的存活者和出局者,o代表存活者,x代表出局者
void ShowLiveGamers(int* &arr, int len){
for(int i = 0; i < len; i++){
if(arr[i] != 0){
cout<<(i+1)<<":o ";
}
else{
cout<<(i+1)<<":x ";
}
}
cout<<endl;
}
//寻找到获胜者的编号
int Winner(int* &arr, int len){
for(int i = 0; i < len; i++){
if(arr[i] != 0){
return i;
}
}
}
//对玩家进行编号和为第一轮各个玩家各自报数的大小赋初值
void init(int* &arr, int len){
for(int i = 0; i < len; i++){
arr[i] = 1+i;
}
}
int main(){
gamers = new int[15]; //为gamer动态分配元素个数为15的一维数组
init(gamers, 15); //初始化gamer
for(int i = 15; i > 1; ){ //i就表示当前存在的人数. 当i == 1时即使得出结果,程序结束
ShowLiveGamers(gamers, 15);
for(int j = 0; j < 15; j++){
if(gamers[j] != 0){
if(gamers[j]%3 == 0){
gamers[j] = 0; //认定为出局
i--; //改名游戏者出局,游戏人数 -1
}
else{
gamers[j] += i; //该名游戏者,下一次报数的大小为 其当前报数大小+当前游戏存活人数
}
}
}
}
ShowLiveGamers(gamers, 15);
int TheLast = Winner(gamers, 15);
cout<<"游戏的获胜者的编号是: "<<TheLast+1<<endl;
delete[] gamers;
}
これらは、アルゴリズムや細部の具体的な実装です//