uva_133_The Dole Queue
考え方:総人数を記録して、人を歩くたびに減らして、大循環の条件として、総人数が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;
}