UVa 133 The Dole Queue

题目大意:
把N个人围成圈逆时针标号。
有两个官员
一个从1逆时针数k个
另一个从n数m个
#同时进行#,被数到的出列。(每次出列一个或两个)
直到数完为之。

代码如下:

   
     
  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int main () {
  5. int n, k, m;//n,k逆时针 m顺时针
  6. while (scanf("%d%d%d", &n, &k, &m) == 3 && (n || k || m)) {
  7. int num[20] = {0};
  8. for (int i = 0; i != n; ++i) {
  9. num[i] = i + 1;
  10. }
  11. int pop(0);
  12. int idx1(0), idx2(n - 1);
  13. while (pop != n) {
  14. if (pop) printf(",");
  15. for (int i = idx1, cnt = 0; cnt != k; ++i) {
  16. if (num[i]) {
  17. if (++cnt == k) idx1 = i;
  18. }
  19. if (i == n - 1) i = -1;
  20. }
  21. for (int i = idx2, cnt = 0; cnt != m; --i) {
  22. if (num[i]) {
  23. if (++cnt == m) idx2 = i;
  24. }
  25. if (!i) i = n;
  26. }
  27. if (idx1 == idx2) {
  28. ++pop;
  29. printf("%3d", num[idx1]);
  30. num[idx1] = 0;
  31. }else {
  32. pop += 2;
  33. printf("%3d%3d", num[idx1], num[idx2]);
  34. num[idx1] = 0;
  35. num[idx2] = 0;
  36. }
  37. }
  38. printf("\n");
  39. }
  40. return 0;
  41. }





你可能感兴趣的:(Queue)