poj 3750 小孩报数问题 解题报告

题目链接: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 }

     

原文地址:https://www.cnblogs.com/windysai/p/3308982.html