1. 程式人生 > >約瑟夫問題 小孩報數問題poj3750

約瑟夫問題 小孩報數問題poj3750

間隔 cto sample memory zhang nbsp 順序 getchar col

                                            小孩報數問題
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