Я работал с Проблема Иосифа (другая часть задания) и что мы должны сделать, это дать две переменные 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;
}
Задача ещё не решена.
Других решений пока нет …