用链表实现杭电1276士兵队列训练问题

来源:互联网 发布:卖房软件 编辑:程序博客网 时间:2024/05/16 02:40

士兵队列训练问题

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


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

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

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

Sample Input
22040
 

Sample Output
1 7 191 19 37
 
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1276

 该题需要注意n<=3的情况:
 当n=1时输出1;
 当n=2时输出1 2;
 当n=3时输出1 2 3;

#include<stdio.h>typedef struct node{    int date;    struct node *next;}*LinkList;LinkList Buile(int n);void delNextNode(LinkList p);int Find(LinkList head, int m, int k);void CountOff(int n);int main(){    int i, N, n;    scanf("%d", &N);    while(N--){        scanf("%d", &n);        if(n <= 3){            printf("1");            for(i = 2; i <= n; i++)                printf(" %d", i);            printf("\n");            continue;        }        CountOff(n);    }    return 0;}void CountOff(int n){    int k = 2;    LinkList head, p;    head = Buile(n);    while(1){        if(k == 2)            k = 1;        else            k = 2;        n = Find(head, n, k);        if(n <= 3)        break;    }    p = head->next;    while(p){        if(k){            printf("%d", p->date);            k = 0;        }        else            printf(" %d", p->date);        p = p->next;    }    printf("\n");}LinkList Buile(int n){    LinkList rear, p, head = new node;    rear = head;    for(int i = 1; i <= n; i++){        p = new node;        p->date = i;        rear->next = p;        rear = p;    }    rear->next = NULL;    return head;}void DelNextNode(LinkList p){    LinkList pre;    pre = p->next;    p->next = pre->next;    delete pre;}int Find(LinkList head, int m, int k){    int i;    LinkList pre = head;    while(pre){        i = k;        while(i--){            if(pre == NULL)                return m;            pre = pre->next;        }        if(!pre || pre->next == NULL)            return m;        DelNextNode(pre);        m--;    }    return m;}


原创粉丝点击