1

私はJosephus 問題(割り当ての別の部分) に取り組んできましたが、私たちがやるべきことは、2 つの変数mとを与えることですnmは開始時のプレーヤーをn表し、プレーヤーの数を表します。mプログラムが適切なプレーヤーで開始し、適切な数のスペースをスキップするように、変数を配置する場所を見つけるのに問題があります。

が 2 で 6 人のプレイヤーがいた場合m、プレイヤー 2 から開始し、プレイヤー 3 にパスされ、プレイヤー 3 を排除してプレイヤー 4 に移動し、プレイヤー 5 にパスして排除するというように、1 人のプレイヤーが残るまで続きます。これは私が得たいと思っている出力です:

Enter M and N: 2 6

Person removed: 3
Person removed: 6
Person removed: 4
Person removed: 2
Person removed: 5

*** AND THE WINNER IS 1!! ***

代わりに、私が持っているコードを使用すると、

Person removed: 2
Person removed: 4
Person removed: 6 
Expression: list iterator not incrementable

に置き換えint i = 1; i <= n; i++て、正しい番号int i = m; i <= n; i++から始めるという考えがありましたが、次のようiになります。

Player removed: 3
Player removed: 5
Player removed: 2
Player removed: 6
*** AND THE WINNER IS 4!! ***

mまた、5 人のプレイヤーしか追加されなかった理由もわかっていますが、正しい数のプレイヤーを追加するためにどこに行けばよいかはよくわかりません。アイデア/ヒントをいただければ幸いです。

#include <iostream>
#include <list>

using namespace std;

int main() {
    int m, n;
    cout << "Enter M and N: ";
    cin >> m;
    cin >> n;
    list<int> players;
    for (int i = 1; i <= n; i++) {
        players.push_back(i); // adding players to the list
    }
    list<int>::iterator it = players.begin();
    while (players.size() > 1) {
        it++;
        if (it == players.end()) { // if the iterator reaches the end of the list
            it = players.begin();  // wrap around to beginning
        }
        cout << "Person removed: " << *it << endl;
        it = players.erase(it);
        if (players.size() == 1) {
            cout << "*** AND THE WINNER IS " << players.front() << "!! ***" << endl;
        }
    }

    system("pause");
    return 0;
}
4

0 に答える 0