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