ゲームのDiushouファンのシンプルなアルゴリズム/ C ++

ゲームのルール:サークルに参加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;
 }

これらは、アルゴリズムや細部の具体的な実装です//

公開された31元の記事 ウォンの賞賛3 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_36557960/article/details/77921747