UVa-133-救济金发放

这题的话,我们首先对于移动函数可以知道,因为只是顺逆的关系,也就是加一或者减一,所以我们每次移动的时候,都补上一个小于n的最大整数,然后取模,这样就不会有负数,而且加之后的结果不会超过2*n,所以我们取模的结果就是0到n-1,然后加上1就可以得到原位置了。

题目中的逆时针就是加一,顺时针就是减一。

#include <stdio.h>
#define maxn 25
int a[maxn];
int n,k,m;

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 p1=n,p2=1,left=n;
        //逆时针从1开始,1 2 3 4 ,我们设置的时候就设置成从n开始移动
        while (left) {
            p1=go(p1,1,k);
            p2=go(p2,-1,m);
            left--;
            printf("%3d",p1);
            if (p1!=p2) {
                left--;
                printf("%3d",p2);
            }
            a[p1]=a[p2]=0;
            if (left) printf(",");
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41090676/article/details/85269455
今日推荐