C ++は、悪者のアルゴリズム/ヨセフの問題を学ぶことは良い人が死ぬことができない死ななければなりません


ゲームのルールは以下のとおりです。2 * kの個人的な新聞の総数は、kの前で良い人であり、kの後ろの悪い男がダイにメートルを報告した良い人、からのgettinの数です。そして、最初に死者からの生活をオフにカウントし続け、人々のmが死亡した、というように報告しました。= 12、kは何mの値を求められたときにすると、すべての良いが死ぬ前に死んで不良ではございません。(実験から)

次のような手順は以下のとおりです。

#include <iostream>

using namespace std;

const int P = 24;

int per[24];

void init(){    //游戏参与者初始化
    for(int i = 0; i < 24; i++){
        per[i] = 1;
    }
}

//算法测试检验
void print(){
    for(int i = 0; i < 24; i++){
        cout << i << "|" << per[i] << " ";
        if(i%6 == 0 && i != 0){
            cout << endl;
        }
    }
}

bool getP(int N, int start,int livers){
    if(livers < 13){
        return true;
    }
    //该处代码省略
    int index = start;      //检验下一个人存活的位置
    for(int i = 0; i < leave-1;){
        //找到一个存活的人就继续寻找下一个
        if(per[index] == 1){
            i++;
            if(index+1 == 24){
                index = 0;
            }else{
                index += 1;
            }
        }else{
            //由于数组范围为24所以,不能越界
            if(index+1 == 24){
                index = 0;
            }else{
                index += 1;
            }
        }
    }
    //寻找死亡的人
    while(true){
        if(per[index] == 1){
            if(index < 12){ //如果死了一个好人,则不满足规则,返回再来下一个数字
                return false;
            }
            per[index] = 0;
            break;
        }else{
            if((index+1) == 24){
                index = 0;
            }else{
                index += 1;
            }
        }
    }
    //确定下一个开始位置
    int next;
    /该处代码省略...
    getP(N, next, livers-1);
}

int main()
{
    init();
    for(int i = 1; i; i++){
        if(getP(i, 0, 24)){
            cout << i << "!!" << endl;
            print();
            break;
        }
        init();
    }
}
上記の手順のコードは、本当に彼女のアルゴリズムのような学生が所有している場合、この問題のアルゴリズム設計のために多くを省略されているが、最適化アルゴリズム
公開された31元の記事 ウォンの賞賛3 ビュー10000 +

おすすめ

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