士兵队列训练问题
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 ",pull(sq)); // 注意最后一个数据后,,没有空格
}
else
{
while(eq->size>1)
{
printf("%d ",pull(eq));
}
printf("%d ",pull(eq));
}
free(sq); // 释放
free(eq);
}
}
return 0;
}