Josephus problem variant logic troubles
I'm supposed to implement a variant of the josephus problem for my C++ class using an STL list. I've got it pretty much half working but there is a logic oversight that I'm making and I keep getting assertion errors. The problem is, I believe, 'wrapping' the iterator from the end of the list to the beginning when the tempcount is less than the M value - or at least that's what the visual studio debugger would lead me to believe. In that instance, itr seems to be pointing to garbage. Help!
Code:
#include <iostream>
#include <list>
using namespace std;
int main(){
//M: incrememnt amount
//N: size of list/number of current 'persons'
//playerList<int>: our list, numbered 1 to N
//done: becoems true when current persons is 1
bool done = false;
int N = 0;
int M = 0;
cout <<"Please enter # of 'players': ";
cin >> N;
cout <<"\nPlease enter an incriment value: ";
cin >> M;
//check for default case, if there's only a single 'player'
if(N <= 1){
cout <<" We need more players!";
system("PAUSE");
return 0;
}
//so we have our values, lets create our list to spec
list<int> playerList;
for(int i = 0; i < N; i++){
playerList.push_back(i+1);
}
//iterator
list<int>::iterator itr;
itr = playerList.begin();
int tempCount = 1;
//add offset(M) to the iterator starting at begin(gradually). whatever it lands on is erased.
//continue this , and wrap around if iterator == end
while(done == false){
if(N == 1){
done = true;
cout << "\nWinner: Player" << *itr << endl; //outputs what the iterator is pointing at
}
else{
//okay, so now we start to traverse the list
//do we wrap?
//and we have tempcount to add to the iterator until we reach m
if(itr == playerList.end()){
if(tempCount == M){
//temp = true;
tempCount = 0;
N--;
cout << "\n Player " << *itr << " lost.";
itr = playerList.erase(itr);
}
else{
itr = playerList.begin(); //almost the same as itr++
tempCount++;
}
}
else{
//we didn't wrap, what do we do
//1: increment the iterator//tempcount
//2: if tempCount = M, delete whats at the iterator
//2.1: if we delete, reset tempCount, and decrease N, output result
//3: soemthing
if(tempCount == M){
tempCount = 0;
N--;
cout << "\n Player " << *itr << " lost.";
itr = playerList.erase(itr);
}
else{
if(itr == playerList.end()){
itr = playerList.begin(); //almost the same as itr++
tempCount++;
}
else{
itr++;
tempCount++;
}
}
}//end inside else
}//end else
}//end while
system("PAUSE");
return 0;
}