Tower of Hanoi

#include <iostream>
#include <stack>

int main() {
  int n;
  std::cin >> n;
  std::stack<int> s[3];
  for (int i = n; i > 0; --i) {
    s[0].push(i);
  }

  int mpos = 0;
  while (!s[0].empty() || !s[1].empty()) {
    s[(mpos + 1 + (n % 2)) % 3].push(s[mpos].top());
    s[mpos].pop();
    mpos = (mpos + 1 + (n % 2)) % 3;

    if (s[0].empty() && s[1].empty())
      break;

    if (s[(mpos + 1) % 3].empty()) {
      s[(mpos + 1) % 3].push(s[(mpos + 2) % 3].top());
      s[(mpos + 2) % 3].pop();
    } else if (s[(mpos + 2) % 3].empty()) {
      s[(mpos + 2) % 3].push(s[(mpos + 1) % 3].top());
      s[(mpos + 1) % 3].pop();
    } else if (s[(mpos + 1) % 3].top() < s[(mpos + 2) % 3].top()) {
      s[(mpos + 2) % 3].push(s[(mpos + 1) % 3].top());
      s[(mpos + 1) % 3].pop();
    } else {
      s[(mpos + 1) % 3].push(s[(mpos + 2) % 3].top());
      s[(mpos + 2) % 3].pop();
    }
  }

  std::cout << "----" << std::endl;

  for (int i = 0; i < 3; ++i) {
    while (!s[i].empty()) {
      std::cout << s[i].top() << ' ';
      s[i].pop();
    }
    std::cout << std::endl;
  }
}