UVA 133 The Dole Queue

本文提供了一种解决UVA-133问题的方法,通过使用双向链表来模拟多人游戏过程,有效地处理了逆时针和顺时针选择人的逻辑。文章详细展示了如何更新链表节点以反映游戏中人员的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UVA-133

题意:n个人逆时针编号围成一个圈,两个考官一个从1逆时针点人,每次点k个,另一个从n顺时针点人,每次点m个,当被点到的人不同时输出 a b,同一个人时输出 a,每个数字占三个场宽。
解题思路:暴力模拟。直接用循环跑的话在跑到0的时候把数字改成1,跑到n+1把数字改成1就好了。我是写双向链表处理。

/*************************************************************************
    > File Name: UVA-133.cpp
    > Author: Narsh
    > 
    > Created Time: 2016年07月15日 星期五 16时29分34秒
 ************************************************************************/

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
struct node{
    int next,bef;
} w[300];
int n,m,k,a,b,num,cnta,cntb;
int ln[30],l;
bool t[60];
int main () {
    while (scanf("%d%d%d",&n,&k,&m) && n+m+k) {
        for (int i = 1; i <= n; i++) {
            w[i].next=i+1;
            w[i].bef=i-1;
        }
        w[1].bef=n;
        w[n].next=1;
        num=0;
        memset(t,true,sizeof(t));
        a=n;
        b=1;
        num=l=0;
        while (num < n) {
            for (int i = 1; i <= k; i++) a=w[a].next;
            for (int i = 1; i <= m; i++) b=w[b].bef;
            if (b == a) {
                ln[++l] =a;
                num++;
                w[w[a].bef].next = w[a].next;
                w[w[a].next].bef = w[a].bef;
                printf("%3d",a);
                if (num != n) printf(",");
            }else {
                w[w[a].bef].next = w[a].next;
                w[w[a].next].bef = w[a].bef;
                w[w[b].bef].next = w[b].next;
                w[w[b].next].bef = w[b].bef;
                if (w[b].bef == a) w[b].bef = w[a].bef;
                if (w[b].next == a) w[b].next = w[a].next;
                if (w[a].bef == b) w[a].bef = w[b].bef;
                if (w[a].next == b) w[a].next = w[b].next;
                printf("%3d%3d",a,b);
                num+=2;
                if (num != n ) printf(",");
            }
        }
        printf("\n");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值