poj3750 小孩报数问题

来源:互联网 发布:泰安知金复读学校 编辑:程序博客网 时间:2024/05/05 02:20


小孩报数问题
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 8929 Accepted: 4191

Description

有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。

Input

第一行输入小孩的人数N(N<=64) 
接下来每行输入一个小孩的名字(人名不超过15个字符) 
最后一行输入W,S (W < N),用逗号","间隔

Output

按人名输出小孩按顺序出列的顺序,每行输出一个人名

Sample Input

5XiaomingXiaohuaXiaowangZhangsanLisi2,3

Sample Output

ZhangsanXiaohuaXiaomingXiaowangLisi


题意在此就不解说了;而此题就是一个循环链表就可以搞定。这很类似于约瑟夫环的问题,唯一区别就在于本题是针对字符串,而约瑟夫环是对排列的数。



代码:



#include<iostream>#include<fstream>#include<iomanip>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<cmath>#include<set>#include<map>#include<queue>#include<stack>#include<string>#include<vector>#include<sstream>#include<cassert>using namespace std;#define LL __int64struct node {    char a[20];    struct node *rear;    struct node *next;};node* create(int n) {    node *point,*head;    head = point = new node;    for(int i=2; i<=n; ++i) {        point->next=new node;        point->next->rear=point;        point=point->next;    }    point->next=head;    head->rear=point;    return head;}node* rmove(node* p,int step) {    for(int i=1; i<step; ++i) {        p=p->next;    }    return p;}node* Delete(node *p) {    p->rear->next = p->next;    p->next->rear = p->rear;    p = p->next;    return p;}int main() {    int n,w,s;    scanf("%d",&n);    node *point,*head;    head=point=create(n);    for(int i = 1; i <= n; ++i) {        scanf("%s",point->a);        point =point->next;    }    // printf("head = %s\n",head->a);    //printf("point = %s\n",point->a);    scanf("%d,%d",&w,&s);    point=rmove(head,w);    //printf("   %s\n",point->a);    while(point->next!=point) {        point=rmove(point,s);        printf("%s\n",point->a);        point=Delete(point);    }    printf("%s\n",point->a);    return 0;}/*5XiaomingXiaohuaXiaowangZhangsanLisi2,3*/



原创粉丝点击