UVa 133,发放救济金

沿用前一个题的思路:

用left记录剩下的点,直到全部选完。

这里我的问题是,我一直pos = (pos + f + n)%n,这里的问题是对于B点来说,开始的位置是1,就成了(1+(-1) +n) %n 是0,位置是从1开始记录的,所以应该是(pos  + f + n - 1) %n + 1;

#include <stdio.h>
#define maxn 25

int n,k,m;
int a[maxn];

int go (int pos ,int f,int t)
{
    while(t--)
    {
        do {
            pos = (pos+f+n-1)%n+1;
        }while(a[pos]==0);
    }
    return pos;
}

int main()
{
    while(scanf("%d%d%d",&n,&k,&m),n)
    {
        for(int i=1;i<=n;i++)
            a[i] = i;

        int pos1 = n;
        int pos2 = 1;
        int left = n;
        while(left)
        {
            pos1 = go(pos1,1,k);
            pos2 = go(pos2,-1,m);

            printf("%3d",pos1);
            a[pos1] = 0;
            left--;
            if(pos1!=pos2)
            {
                printf("%3d",pos2);
                a[pos2] = 0;
                left --;
            }
            if(left) printf(",");
        }
        puts("");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TreeDream/p/5843701.html