您的位置:首页 > 其它

poj3750 小孩报数问题

2013-11-22 20:02 615 查看
小孩报数问题

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 8929 Accepted: 4191
Description

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

第一行输入小孩的人数N(N<=64) 

接下来每行输入一个小孩的名字(人名不超过15个字符) 

最后一行输入W,S (W < N),用逗号","间隔
Output

按人名输出小孩按顺序出列的顺序,每行输出一个人名
Sample Input
5
Xiaoming
Xiaohua
Xiaowang
Zhangsan
Lisi
2,3

Sample Output
Zhangsan
Xiaohua
Xiaoming
Xiaowang
Lisi


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

代码:

#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 __int64
struct 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;
}
/*

5 Xiaoming Xiaohua Xiaowang Zhangsan Lisi 2,3

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息