1. 程式人生 > >C++ Poj3750 小孩報數問題

C++ Poj3750 小孩報數問題

一、題目:

        http://poj.org/problem?id=3750

二、思路:

      1.考慮儲存方式:用字元陣列儲存小孩的名字,如name[65][20];

      2.解決報到尾時不足S,要回到開頭從0開始報到,用求餘;

      3.考慮已經輸出的孩子如何進行處理:是移動陣列,還是標記已經輸出過,兩種方法都可以;

       這道題與約瑟夫問題有點不同,輸出第一個小孩名字時,因為此時w = 2,是從Xiaohua開始數,Xiaohua並不出列。而約瑟夫問題呢?Start=4,首先要把第4個人先出列,再去數s步,把第二個人出列,接著把其他人出列。

三、實現程式:AC

#include <iostream>

using namespace std;



char name[65][20]; // 儲存孩子的名字



int main(int argc, const char * argv[]) {

    int n, w, s, i, count; // n儲存孩子數, w:從第w個開始報數,s報到第s個

    char ch; // 把逗號去掉

    

    cin >> n; // 輸入孩子數

    // 迴圈輸入孩子的名字

    for(i = 0; i < n; i++)

        cin >> name[i];

    cin >> w >> ch >> s;

    

    count = 0;

    w = w - 2; // 減2是因為第一個比較特殊,下標從0開始減1,其次因為xiaohua沒輸出過,是第一個數

    while(count < n) { // 已經出列的人數

        for(i = 0; i < s; i++) {

            w = (w + 1) % n; // 求餘,解決到尾要重新從0開始的問題,形成迴圈

            if(name[w][18] == '1') //如果此人已出列,不算

                i--;

        }

        cout << name[w] << endl;

        name[w][18] = '1'; //把此人標記為找過

        count++;

    }

    return 0;

}

執行結果: