A - 士兵队列训练问题

    这个题目应该是对于栈或者队列的热身题吧,但是一开始没看栈和队列的应用所以导致不会用简单的方法去做,后来使用了数组模拟输出,又因为输出了退格符的原因WA了好多次(打脸)。



Description

某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。 

Input

本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。 
 

Output

共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。 
 

Sample Input

2
20
40
 

Sample Output

1 7 19
1 19 37
 


下面贴出我的代码,然后就是做了一些注释。

 

#include<iostream>
using namespace std;
#define MAX 5001
int n, x, i, count1, final;//n:数据组数,x:新兵人数,count1:统计当前人数,final:最后一个人的编号
int Soldiers[MAX];//士兵数组
void Init()//初始化士兵数组
{
    for(i=1;i<=x;i++)Soldiers[i]=i;
    for(i=5000;i>x;i--)Soldiers[i]=0;//由于当时不知道有memset这东西,所以就出现了这行代码, 大神请无视...
}
void Process()//处理过程,模拟删除2和3编号的人数
{
    int flag;//用来统计是否达到2或者3
    flag=0;
    for(i=1;i<=final;i++)//模拟删除2的过程
    {
        while(Soldiers[i])
        {
            flag++;
            if(flag==2)
            {
                Soldiers[i]=0;//0代表这个人没了
                count1--;
                flag=0;
            }
            break;
        }
    }
    if(count1<=3)return;//判断
    flag=0;
    for(i=1;i<=final;i++)
    {
        while(Soldiers[i])
        {
            flag++;
            if(flag==3)
            {
                Soldiers[i]=0;
                count1--;
                flag=0;
            }
        break;
        }
    }
    if(count1<=3)return;
}
void Print()
{
    for(i=1;i<=final;i++)
    {
        while(Soldiers[i])
        {
            if(i!=1)cout<<" ";//对于输出空格的处理,嗯,要的就是这种效果!
            cout<<Soldiers[i];
            break;
        }
     }
     cout<<endl;
}
int main()
{
    cin>>n;
    while(n--)
    {
        cin>>x;
        count1=x;
        final=x;
        Init();
        while(count1>3)Process();
        Print();
    }
    return 0;
}