Проблема с Иосифом

Я работал с проблемой Джозефуса (другая часть задания), и мы должны дать две переменные m а также n, m обозначает игрока, с которого начинается и n обозначает количество игроков. У меня проблема с выяснением, где поставить m переменная, так что программа запускается на правом проигрывателе и пропускает соответствующее количество пробелов.

Так что если m было 2 и было 6 игроков, это началось бы с игрока 2, было бы передано игроку 3, уничтожить игрока 3 и перейти к игроку 4, перейти к игроку 5 и уничтожить их, и так далее, пока не останется один игрок. Это вывод, который я надеюсь получить:

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 может пойти так, что он добавляет правильное количество игроков. Любые идеи / советы будут оценены.

#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;
}

0 ответов

Другие вопросы по тегам