uva 133

来源:互联网 发布:oracle数据库sql语句 编辑:程序博客网 时间:2024/05/16 08:52

还是约瑟夫问题

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn  = 25;int num[maxn];int flag[maxn];int main(){    int n,k,m;    while(~scanf("%d %d %d",&n,&k,&m) && n && k && m)    {        memset(flag,false,sizeof(flag));        for(int i = 0; i < n; ++i)            num[i] = i + 1;        int mark1 = 0 , mark2 = n - 1;        int sum = 0;        while(sum != n)        {            int cnt = 0;            while(true)            {                if(!flag[mark1%n])                    cnt++;                if(cnt == k) break;                mark1++;            }            cnt = 0;            while(true)            {                if(mark2 == -1) mark2 = n - 1;                if(!flag[mark2%n])                    cnt++;                if(cnt == m) break;                mark2--;            }            flag[mark1%n] = flag[mark2%n] = true;            if(mark1 % n == mark2 % n)            {                sum += 1;                printf("%3d",num[mark1%n]);            }            else            {                sum += 2;                printf("%3d%3d",num[mark1%n],num[mark2%n]);            }            if(sum < n) putchar(',');        }        putchar('\n');    }    return 0;}