C++算法学习/约瑟夫问题之坏人必须死好人不能死


游戏规则为:总共有2 * k个人报数,前面k个是好人,后面k个是坏人,从第一个好人开始报数,报道m的人要死去。然后从死人的下一个活人继续从头开始报数,报道m的人死去,以此类推。当k = 12时,问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 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36557960/article/details/78572757