您的位置:首页 > 其它

HDU 1276 士兵队列训练问题

2014-03-20 14:07 176 查看


士兵队列训练问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 3137    Accepted Submission(s): 1443


Problem Description

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

 

Input

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

 

Output

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

 

Sample Input

2
20
40

 

Sample Output

1 7 19
1 19 37

 

        算是最简单的关于链表的题了吧!如果还有更简单的,期望各位推荐

。虽说是原创,其实只是半原创

,抄了一遍大牛们的代码,然后根据自己的理解加了注释,有什么不对的地方还请大牛们批评指正


代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int num;
struct node *next;
} S;///定义节点
S *l;///定义一个指向结构体的指针
int n;///链表的元素个数
S *init()
{
S *L,*q,*s;
int i;
L=(S*)malloc(sizeof(S));
L->next=NULL;///头结点指针域为空
s=L;///让指针指向头节点
for(i=1; i<=n; i++)
{
q=(S *)malloc(sizeof(S));///申请空间
q->num=i;///赋值
q->next=NULL;///置空
s->next=q;///连接头结点和第一个子节点
s=s->next;///指针后移
}
return L;///返回到头结点
}
void dele(int x)
{
S *s=l,*q;///s指向头结点
int i=1;///寻找删除点
while(s->next)
{
if(x==i)
{
i=1;
q=s->next;///指针q指向当前头结点的后一个元节点
s->next=s->next->next;///移动指针位置,到q指向节点的后一个节点
free(q);///释放空间,删除元素
n--;///删除元素后,链表大小-1
}
else
{
i++;
s=s->next;///指针后移
}
}
}
void print()
{
S *s=l->next,*q;
while(s)
{
if(s->next==NULL)
printf("%d\n",s->num);
else
printf("%d ",s->num);
//  q=s;
s=s->next;
// free(q);
/**每输出一个节点就释放一个节点的空间
这样做应该是为了节省空间,但是我把两个代码
都提交后发现在时间和空间上并没有什么区别,
更详细的还请各位大神讲解**/
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int flag=0;
scanf("%d",&n);
l=init();
while(n>3)
{
if(flag==0)
{
dele(2);
flag=1;
}
else
{
dele(3);
flag=0;
}
}
print();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: