/* 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; }