uva_133_The Dole Queue

4169 ワード

考え方:総人数を記録して、人を歩くたびに減らして、大循環の条件として、総人数が0の時に循環を飛び出します;大きい循環の中で2つの循環をカバーして、1つは時計回りに歩いて、1つの反時計回りは最後にコードを出力することができます:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int a[25],n,k,m,i,j,sum,flagk,flagm,flagi,flagj;
    while(~scanf("%d%d%d",&n,&k,&m))
    {
        sum=n;j=n-1;
        for(i=0;i<25;i++) a[i]=1;
        i=0;
        if(n==0&&k==0&&m==0) break;
        flagk=k;flagm=m;
        while(n>0)
        {
            while(1)
            {
                if(a[i]==1)
                    flagk--;
                if(flagk==0)
                {
                    flagi=i;
                    flagk=k;
                    break;
                }
                i++;
                if(i==sum) i=0;
            }
            while(1)
            {
                if(a[j]==1) flagm--;
                if(flagm==0)
                {
                    flagm=m;
                    a[j]=0;
                    a[flagi]=0;
                    flagj=j;
                    if(flagi==flagj) n-=1;
                    else n-=2;
                    break;
                }
                j--;
                if(j<0) j=sum-1;
            }
            if(flagi==flagj) printf("%3d",flagi);
            else printf("%3d%3d",flagi,flagj);
            if((n==2&&flagi==flagj)||(n==1))
                continue;
            else printf(",");
            printf("
**%d**
"
,n); } } return 0; }