UVa133

题目描述

20201228182547

代码

#include<stdio.h>
#define maxn 25
int n, k, m, a[maxn]; // n 是人数,官员 A 从 1 开始逆时针数数,数 k 个然后停下来,官员 B 从 n 开始数数,数 m 个停下来

// 逆时针走 t 步,步长是 d (-1 表示顺时针走),返回新位置,从 p 出发
int go(int p, int d, int t)
{
    while (t--)
    {
        do {
            p = (p - 1 + d + n) % n + 1; // 这里是先将 <1 到 n> 映射到 <0 到 n - 1>,加 n 是为了处理步长为负的情况
        } while (a[p] == 0); // 走到下一个非 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; // A 从 1 开始,逆时针点数,所以初始值取 n,那么下一个数就是 1,B 从 n 开始,顺时针点数,初始值为 1,下一个数就是 n
        while (left)
        {
            p1 = go(p1, 1, k); // 逆时针走 k 步
            p2 = go(p2, -1, m); // 顺时针走 m 步
            printf("%3d", p1);
            left--;
            if (p2 != p1) // 如果 p2 不等于 p1
            {
                printf("%3d", p2);
                left--;
            }
            a[p1] = a[p2] = 0; // 用过的位置就归零
            if (left)
                printf(",");
        }
        printf("\n");
    }
    return 0;
}
posted @ 2020-12-28 18:27  模糊计算士  阅读(74)  评论(0编辑  收藏  举报