某部队进行新兵队列训练,将新兵从一开始按程序顺次编号,并排成一行横队,训练的规定如下:从头开始一至二报数,凡报到二的入列,剩下的向小序号方向聚拢,再从头开始进行一至三报数,凡报到三的入列,剩下的向小序号方向聚拢,持续从头开始进行一至二报数。。。,当前从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,别离对应输出的新兵人数,每行输入剩下的新兵最后的编号,编号之间有一个空格。
Sample Input
2
20
40
Sample Output
1 7 19
1 19 37

#include<iostream>#include<algorithm>#include<string>#include<string.h>#include<cstdio>#include<queue>#include<stack> #include<set> #include<map>#include<list>#include<cstdio>using namespace std;//#include<bits/stdc++.h>//万能头文件 int main(){    int t = 0, n = 0;    cin >> t;    while(t--){//测试组数         cin >> n;//士兵人数         int k = 2;//删除规定的距离数,初始为2   2,3交替         list<int >blist;//创立一个空链表         list<int >::iterator it;//创立一个list迭代器        for(int i = 1; i <= n; i++){//从地位1开始给链表赋初值             blist.push_back(i);         }         while(blist.size() > 3){//保留最初3个元素             int num;//报数的人             num = 0;            for(it = blist.begin();it != blist.end();){//因为找到后要间接删掉链表对应的值,用迭代器遍历 //                if(num++ % k == 0){//                num++;                if(num % k == 0){//这种写法得不出正确答案                     it = blist.erase(it);//删除该满足条件的指定元素                }else{                    it++;//不能删除的过,it须要自增,要不是死循环                 }            }            if(k == 2){//实现2,3转换                 k = 3;                continue;            }else{                k = 2;                continue;            }        }        for(it = blist.begin(); it != blist.end(); it ++){//依照格局遍历剩下的三个数             if(it != blist.begin()){                cout << " ";            }            cout << *it;        }         cout << endl;    }    return 0;}