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");
}
}