hdu-1276-士兵队列训练问题

士兵队列训练问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2699    Accepted Submission(s): 1238

Problem Description

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

 

 

Input

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

 

 

Output

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

 

 

Sample Input

2

20

40

 

 

Sample Output

1 7 19

1 19 37

解题思路:

 

1、  用队列实现。

 

程序代码:

 

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<malloc.h>

 

//定义一个队列

struct queue

{

    int capacity;

    int size;

    int *array;

    int front;

    int rear;

};

 

//入列

int add(queue *q ,int value)

{

    q->array[q->rear]=value;

    q->rear++;

    q->size++;

    return value;

}

 

int peek(queue *q)

{

    return q->array[q->front];

}

 

//出列

int pull(queue *q)

{

    int value;

    value=q->array[q->front];

    q->array[q->front]=0;

    q->front++;

    q->size--;

    return value;

}

 

int get_size(queue *q)

{

    return q->size;

}

 

int get_capacity(queue *q)

{

    return q->capacity;

}

// 队列初始化

int init_queue(queue *q,int capacity )

{

    q->capacity=capacity;                    

    q->size=0;

    q->front=0;

    q->rear=0;

    q->array = (int *)malloc(capacity *sizeof(int));

    memset(q->array,0,sizeof(q->array));

    return 0;

}

// 每次都要全赋值为 0;

int init_queue(queue *q)

{

    q->size =0;

    q->front =0;

    q->rear = 0;

    return 0;

}

//  释放

int free_queue(queue *q)

{

    free(q);

    return 0;

}

 

int main()

{

    int cases,i,n,j,num=2;

    queue *sq = NULL;

    queue *eq = NULL;

    while(scanf("%d",&cases)!=EOF)

    {

        while(cases--)

        {

             sq = (queue*)malloc(sizeof(queue));

             eq = (queue*)malloc(sizeof(queue));

             scanf("%d",&n);

             init_queue(sq,n);

             init_queue(eq,n);

             for(i=1; i<=n; i++)

             {

                    add(sq,i);        // 把数据入队列

             }

             num=2;

             while(1&&n>3)

             {

                    i=1;

                    if(num==2)

                    {

                        while(sq->size>0)

                        {

                            if(i!=num)

                            {

                                add(eq,pull(sq));    // 满足条件放到另一个队列里

                                i++;

                            }

                            else

                            {

                                pull(sq);              //不满足的 出队列 舍弃

                                i=1;           

                            }

                         }

                         if(eq->size<=3)

                         break;

                         num=3;

                         init_queue(sq);                 //  要记得清零 便于下使用

                     }

                    else if(num==3)

                    {

                        while(eq->size>0)

                        {

                            if(i!=num)

                            {

                                add(sq,pull(eq));             // 不等于三的 数据 放到另一个队列里

                                i++;

                            }

                            else

                            {

                                pull(eq);

                                i=1;

                            }

                         }

                         if(sq->size<=3)

                         break;

                         num=2;

                         init_queue(eq);

                    }

              }

              if(eq->size==0)                         //  有数据的队列输出即可     

              {

                    while(sq->size>1)

                    {

                        printf("%d ",pull(sq));       

                    }

                    printf("%d\n",pull(sq));           //  注意最后一个数据后,,没有空格

               }

               else

               {

                    while(eq->size>1)

                    {

                        printf("%d ",pull(eq));

                    }

                    printf("%d\n",pull(eq));

                }

                free(sq);                           // 释放

                free(eq);

        }

    }

    return 0;

}

posted @ 2013-08-13 21:07  hpuacm周宏伟  阅读(321)  评论(0编辑  收藏  举报