#include <iostream>

int lineNumber;
enum pole { left, middle, right };

void towersOfHanoi (int n, pole start, pole temporary, pole destination)
{
   if (n > 0) {
      towersOfHanoi(n-1, start, destination, temporary);
      lineNumber++;
      std::cout << lineNumber << ". Move the top from the " << start
                << " pole to the " << destination << " pole.\n";
      towersOfHanoi(n-1, temporary, start, destination);
   }   
}

void towersOfHanoi(
   int d)
{
   lineNumber = 0;
   towersOfHanoi(d, left, middle, right);
}


std::ostream& operator<< (
   std::ostream& os, 
   pole p)
{
   switch(p) {
   case left:    os << "left";    break;
   case middle:  os << "middle";  break;
   case right:   os << "right";   break;
   }   
   return os; 
}

int main()
{
   towersOfHanoi(3);

   return 0;
}