题意:救济金发放:
n个人站成一圈,逆时针编号为1~n。
有两个官员A和B。
A从1开始逆时针数,每轮数k个就停下来。
B从n开始顺时针数,每轮数m个就停下来。
给出n,k,m,按格式输出每轮里被选中的人的编号。
解题思路:
引用:看了题解发现同样是模拟,应该先由顶向下分块,然后将需要的函数拿出来写会让整体结构更清晰。
大白的代码里其中go函数里求下一步的规律写的很好,以至于我还没有理解。。先放放继续进行吧
AC代码:
#include<stdio.h>
int n,k,m,a[25];
int go(int p,int d,int t)
{
while(t--)
{
do
{
p=(p+d+(n-1))%n+1;
}
while(a[p]==0);
}
return p;
}
int main()
{
while(scanf("%d%d%d",&n,&k,&m)==3&&n)
{
for(int i=1;i<=n;i++)
a[i]=i;
int left=n;
int p1=n,p2=1;
while(left)
{
p1=go(p1,1,k);
p2=go(p2,-1,m);
printf("%3d",p1);
left--;
if(p1!=p2)
{
printf("%3d",p2);
left--;
}
a[p1]=a[p2]=0;
if(left) printf(",");
}
printf("\n");
}
return 0;
}