您的位置:首页 > 产品设计 > UI/UE

UVa 133 The Dole Queue

2010-03-06 19:58 399 查看
/*
coder:ACboy
date:2010-3-6
result: AC
description: UVa 133 The Dole Queue
*/

#include <iostream>
using namespace std;

// data1个data2两个数组分别用来存储顺时针和逆时针
// 查找时要遍历的数据。例如:data1[] = {1, 2, ... , n}
// 则data2[2] = {n, ..., 2, 1}
int data1[50];
int data2[50];

// 分别用来标记两个数组中的数是否被取出,vis[i] == 0表示未被取出
int vis1[50];
int vis2[50];

// 顺时针查找下一个要被选出来的数在数组中的位置
// begin表示开始查找的位置,n表示初始化时有多少个数
// step表示要找的是当前之后的第几个。
int find1(int begin, int n, int step) {
int count = 0;
while (step != count) {
if (begin == n) begin = 0;
if (!vis1[begin]) {
count++;
if (count == step) break;
}
begin++;
}
return begin;
}

// 逆时时针查找下一个要被选出来的数在数组中的位置
// begin表示开始查找的位置,n表示初始化时有多少个数
// step表示要找的是当前之后的第几个。
int find2(int begin, int n, int step)
{
int count = 0;
while (step != count)
{
if (begin == n) begin = 0;
if (!vis2[begin]) {
count++;
if (count == step) break;
}
begin++;
}
return begin;
}

int main()
{
int N, k, m;
#ifndef ONLINE_JUDGE
freopen("133.txt", "r", stdin);
#endif
while (cin >> N >> k >> m)
{
int i, j;
if (N == k && k == m && m == 0) break;
for (i = 0; i < N; i++)
{
data1[i] = i + 1;
data2[i] = N - i;
}
int count = 0;
int a = 0, b = 0;
memset(vis1, 0, sizeof(vis1));
memset(vis2, 0, sizeof(vis2));
while (count != N)
{
int flag = 0;
// 搜索下一个要取出的数在两个数组中的位置
a = find1(a, N, k);
b = find2(b, N, m);
// 如过要取出的两个数一样则count只需减一
// flag用来标记取出了两个不相同数还是两个一样的数
if (data1[a] == data2[b]) {
count++;
flag = 1;
}
else count += 2;
// 数被取出后相应的标记位置为1
vis1[a] = 1;
vis1[N - 1 - b] = 1;
vis2[N - 1 - a] = 1;
vis2[b] = 1;
if (flag) {
printf("%3d", data1[a]);
} else {
printf("%3d%3d", data1[a], data2[b]);
}
// 只要最后的数还没有被取出就要输出逗号,作为每次取出的数的分隔符
if (count != N) printf(",");
}
cout << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  存储 2010