首页 > 代码库 > 约瑟夫问题 小孩报数问题poj3750

约瑟夫问题 小孩报数问题poj3750

                                            小孩报数问题
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 15228   Accepted: 6778

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
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
此题也是约瑟夫问题,此题有多种解法,可用链表,数组,还有vector等等,以下代码vector所写
 1 #include<stdio.h>
 2 #include<vector>
 3 #include<string>
 4 #include<iostream>
 5 using namespace std;
 6 vector<string> str;
 7 int n;
 8 int W,S;
 9 int bg,en;
10 int main(){
11     freopen("in.txt","r",stdin);
12     scanf("%d",&n);
13     for(int i=0;i<n;i++){
14         string s;
15         cin>>s;
16         str.push_back(s);
17     }
18     scanf("%d",&W);
19     W--;        //由于vector数组从0开始,所以此时W要减一
20     getchar();
21     scanf("%d",&S);
22     while(!str.empty()){
23         int len=str.size();
24         W=(W+S-1)%len;
25         cout<<str[W]<<endl;
26         str.erase(str.begin()+W);
27     }
28 }

 

约瑟夫问题 小孩报数问题poj3750