首页 > 其他 > 详细

UVa133

时间:2020-12-28 21:39:11      阅读:31      评论:0      收藏:0      [点我收藏+]

题目描述

技术分享图片

代码

#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;
}

UVa133

原文:https://www.cnblogs.com/fanlumaster/p/14202969.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!