题目链接:http://poj.org/problem?id=3750
约瑟夫问题,直接模拟即可。
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 const int maxn = 65; 6 7 int main() 8 { 9 char ch; 10 int i, n, w, s, num[maxn]; 11 string per[maxn]; 12 while (scanf("%d", &n) != EOF) 13 { 14 for (i = 0; i < n; i++) 15 { 16 cin >> per[i]; // 保存人名 17 num[i] = i; // 保存人名所对应的编号 18 } 19 cin >> w >> ch >> s; 20 w = w - 1; // 严谨写法应为:w = (w-1+n) % n,但题目说w < n,所以这样写也能通过,表示游戏刚开始时第一个报数人的编号,数组下标是从0开始的 21 do 22 { 23 // printf("n = %d\n", n); 24 w = (w + s - 1) % n; // 得出从第w个开始的第s个位置,如果超出n,则mod n 来保证循环
25 cout << per[num[w]] << endl; // 该人出列 26 for (i = w; i < n-1; i++) 27 per[i] = per[i+1]; // 后面的人顶上出列的人的位置,即都往前挪 28 } while (--n); // 注意是--n,n--是错误的!! 29 } 30 return 0; 31 }