约瑟夫问题

N个人围成一个圈,从第1个人开始报数,没数到三,则这个人就要自杀,然后后面的人接着报数,怎么使得有M个人存活下来。

#include <iostream>
using namespace std;

#define N 41
#define M 3
int main(void)
{
    int man[N] = {0};
    int count = 1;
    int i = 0,pos = -1;
    int alive = 0;

    while(count <= N){
        do{
            pos = (pos + 1) % N;
            if (man[pos] == 0)
            {
                i++;
            }
            if (i == M)
            {
                i = 0;
                break;
            }

        }while(1);

        man[pos] = count;
        count++;
    }

    cout<<"Joseph arrangement: "<<endl;
    for (int i = 0; i < N; i++)
    {
        cout<<man[i]<<' ';
        if ((i + 1)%10 == 0)
        {
            cout<<endl;
        }
    }
    
    cout<<endl;
    cout<<"the number of people you want secure:"<<endl;
    cin>>alive;

    cout<<"the L represent the living."<<endl;
    for (int i = 0; i < N; i++)
    {
        if (N - man[i] < alive)
        {
            cout<<"L";
        }
        else{
            cout<<"D";
        }
        if ((i + 1)%5 == 0)
        {
            cout<<"    ";
        }
    }
    cout<<"\nfinish";
    return 0;
}
点赞