• 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("
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    闭包跟装饰器
    几个常见的面试题目
    函数的进阶
    python的生成器和迭代器
    Python的数据类型
    “随手记”开发记录day09
    “随手记”开发记录day08
    “随手记”开发记录day07
    “随手记”开发记录day06
    “随手记”开发记录day05
  • 原文地址:https://www.cnblogs.com/fanlumaster/p/14202969.html
Copyright © 2020-2023  润新知