題目:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=69
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 #include <bits/stdc++.h> using namespace std;struct Node { Node (int i) : n{i} {} int n; Node* l = nullptr ; Node* r = nullptr ; }; int main () { ios::sync_with_stdio (0 ); cin.tie (0 ); int n, k, m; while (cin >> n >> k >> m){ if (n == 0 && k == 0 && m == 0 ) break ; Node* head = new Node (1 ); Node* prev = head; for (int i=2 ; i<=n; ++i){ Node* curr = new Node (i); curr->l = prev; prev->r = curr; prev = curr; } head->l = prev; prev->r = head; Node* right = head, *left = prev; bool flag = false ; int remain = n; while (remain > 0 ){ if (flag) printf ("," ); flag = true ; for (int i=1 ; i<k; ++i) right = right->r; for (int i=1 ; i<m; ++i) left = left->l; Node* pk = right; Node* pm = left; if (pk == pm){ printf ("%3d" , pk->n); Node* next = pk->r; pk->r->l = pk->l; pk->l->r = pk->r; delete pk; right = next; left = next->l; remain--; } else { printf ("%3d%3d" , pk->n, pm->n); Node* nextR = pk->r; Node* nextL = pm->l; pk->r->l = pk->l; pk->l->r = pk->r; pm->r->l = pm->l; pm->l->r = pm->r; right = nextR; if (right == pm) right = pm->r; left = nextL; if (left == pk) left = pk->l; delete pk; delete pm; remain -= 2 ; } } puts ("" ); } return 0 ; }