士兵队列操作模拟

Description

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

Input

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

Output

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


代码:

使用c++引用类型,其他语法均为c语言语法。

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 5000
#define SIZEINCREMENT 10 
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}Sqlist;
Status InitList(Sqlist &L)
{
L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L.elem) return ERROR;
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
Status ListInsert(Sqlist &L,int i,ElemType n)
{
ElemType *newbase;
if (L.length >= L.listsize)
{
newbase = (ElemType *)realloc(L.elem, (LIST_INIT_SIZE + SIZEINCREMENT) * sizeof(ElemType));
if (!newbase) return ERROR;
L.elem = newbase;
L.listsize = L.listsize + SIZEINCREMENT;
}
*(L.elem + i) = n;
L.length++;
return OK;
}
Status CreatList(Sqlist &L,int m)
{
int i,n;
for (i = 1; i <= m; i++)
{
ListInsert(L, i, i);
}
return OK;
}
void PrintList(Sqlist L)
{
int i;
printf("%d", L.elem[1]);
for (i = 2; i <= L.length; i++)
printf(" %d", L.elem[i]);
printf("\n");
}
Status ListDelet(Sqlist &L,int n)
{
if ((n < 1) || (n > L.length))return ERROR;;
ElemType *p = &(L.elem[n]);
ElemType *q = L.elem + L.length;
for (p++; p <= q; p++) *(p - 1) = *p;
L.length--;
return OK;
}
Status OperateList(Sqlist &L)
{
int i;
if (L.length <= 3) return ERROR;
for (i = 2; i <= L.length; i++)
{
ListDelet(L, i);
}
if (L.length <= 3) return ERROR;
else
for (i = 3; i <= L.length; i = i+2)
{
ListDelet(L, i);
}
OperateList(L);




}
int main()
{
Sqlist L;
int m,m1,j;
while (scanf("%d", &m) != EOF)
{
for (j = 0; j < m; j++)
{
InitList(L);
scanf("%d", &m1);
CreatList(L, m1);
OperateList(L);
PrintList(L);
}
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值