# Turbo C++ - Tower Of Hanoi Algorithm Source Code

You can find the complete Turbo C++ source code for Tower of Hanoi algorithm. Given the number of discs as input, you can get the print out of the list of steps you need to solve the problem.

This program is developed in Turbo C++ application and takes the number of discs as input. It uses recursive logic to find the number of steps required to solve thr problem. I have implemented my own stack. Initially the discs are getting added into the stack. I have 3 stacks A, B and C for 3 towers A, B and C. The function SolveTOH is used to compute all possible steps to solve the problem. Note that it uses the recursive logic and the output after each move is written on the screen.

The Big O notation for this problem is: 2^n - 1.

The other related links are given below:

The complete turbo source code and executable can be found at the end of the page.

## Source Code

#include <stdio.h>

#include <iostream.h>

#include <alloc.h>

#include <stdlib.h>

#include <string.h>

typedef enum boolean

{

false = 0, true = 1

} bool;

template<class T> class MyStack

{

T *m_data;

int m_numElements;

public:

MyStack() : m_data(NULL), m_numElements(0) { }

~MyStack()

{

free(m_data);

m_data = NULL;

m_numElements = 0;

}

bool empty()

{

free(m_data);

m_data = NULL;

m_numElements = 0;

return true;

}

bool push(T data)

{

if(m_data == NULL) // root node

{

m_numElements = 1;

m_data = (T*) malloc(sizeof(T));

}

else

{

m_numElements++;

m_data = (T*) realloc(m_data, m_numElements * sizeof(T));

memmove(&m_data, m_data, (m_numElements - 1) * sizeof(T));

}

m_data = data;

return true;

}

int pop()

{

int result = -1;

if(m_data == NULL) // root node

{

m_numElements = 0;

return -1;

}

else

{

result = top();

if(m_numElements == 1)

{

// last item

m_numElements = 0;

free(m_data);

m_data = NULL;

}

else

{

m_numElements--;

memmove(m_data, &m_data, m_numElements * sizeof(T));

m_data = (T*) realloc(m_data, m_numElements * sizeof(T));

}

}

return result;

}

int size()

{

return m_numElements;

}

T top();

void PrintStack();

};

int MyStack<int>::top()

{

if(m_numElements > 0)

return m_data;

}

void MyStack<int>::PrintStack()

{

int i = 0;

printf("[");

for(i = m_numElements - 1; i >= 0; i--)

{

printf("%d", m_data[i]);

}

printf("]");

}

static int movecount = 0;

static int countA = 0;

static int countB = 0;

static int countC = 0;

static MyStack<int> *A = 0;

static MyStack<int> *B = 0;

static MyStack<int> *C = 0;

void PrintStacks()

{

if (countA != A->size() ||

countB != B->size() ||

countC != C->size())

{

int diffA = A->size() - countA;

int diffB = B->size() - countB;

int diffC = C->size() - countC;

if (diffA == 1)

{

if (diffB == -1)

printf("Move Disc %d From B To A", A->top());

else

printf("Move Disc %d From C To A", A->top());

}

else if (diffB == 1)

{

if (diffA == -1)

printf("Move Disc %d From A To B", B->top());

else

printf("Move Disc %d From C To B", B->top());

}

else //if (diffC == 1)

{

if (diffA == -1)

printf("Move Disc %d From A To C", C->top());

else

printf("Move Disc %d From B To C", C->top());

}

countA = A->size();

countB = B->size();

countC = C->size();

printf("\n");

}

A->PrintStack();

printf(" , ");

B->PrintStack();

printf(" , ");

C->PrintStack();

printf(" , ");

}

void Solve2DiscsTOH(MyStack<int> *source, MyStack<int> *temp, MyStack<int> *dest)

{

temp->push(source->pop());

movecount++;

PrintStacks();

dest->push(source->pop());

movecount++;

PrintStacks();

dest->push(temp->pop());

movecount++;

PrintStacks();

}

int SolveTOH(int nDiscs, MyStack<int> *source, MyStack<int> *temp, MyStack<int> *dest)

{

if (nDiscs <= 4)

{

if ((nDiscs % 2) == 0)

{

Solve2DiscsTOH(source, temp, dest);

nDiscs = nDiscs - 1;

if (nDiscs == 1)

return 1;

temp->push(source->pop());

movecount++;

PrintStacks();

//new source is dest, new temp is source, new dest is temp;

Solve2DiscsTOH(dest, source, temp);

dest->push(source->pop());

movecount++;

PrintStacks();

//new source is temp, new temp is source, new dest is dest;

SolveTOH(nDiscs, temp, source, dest);

}

else

{

if (nDiscs == 1)

return 0;

Solve2DiscsTOH(source, dest, temp);

nDiscs = nDiscs - 1;

dest->push(source->pop());

movecount++;

PrintStacks();

Solve2DiscsTOH(temp, source, dest);

}

return 1;

}

else if (nDiscs >= 5)

{

SolveTOH(nDiscs - 2, source, temp, dest);

temp->push(source->pop());

movecount++;

PrintStacks();

SolveTOH(nDiscs - 2, dest, source, temp);

dest->push(source->pop());

movecount++;

PrintStacks();

SolveTOH(nDiscs - 1, temp, source, dest);

}

return 1;

}

int main()

{

int sz, i, maxdisc;

A = (MyStack<int>*) malloc(sizeof(MyStack<int>));

B = (MyStack<int>*) malloc(sizeof(MyStack<int>));

C = (MyStack<int>*) malloc(sizeof(MyStack<int>));

while(1)

{

printf("\nEnter the number of discs (-1 to exit): ");

scanf("%d", &maxdisc);

if(maxdisc == -1)

break;

if(maxdisc < 2 || maxdisc > 9)

{

printf("Enter between 2 - 9");

continue;

}

movecount = 0;

memset((void*)A, 0, sizeof(MyStack<int>));

memset((void*)B, 0, sizeof(MyStack<int>));

memset((void*)C, 0, sizeof(MyStack<int>));

for (i = maxdisc; i >= 1; i--)

A->push(i);

countA = A->size();

countB = B->size();

countC = C->size();

PrintStacks();

SolveTOH(maxdisc, A, B, C);

printf("Total Moves = %d", movecount);

C->empty();

}

return 0;

}

## Output

Enter the number of discs (-1 to exit): 0

Enter between 2 - 9

Enter the number of discs (-1 to exit): 1

Enter between 2 - 9

Enter the number of discs (-1 to exit): 2

 , [] , [] , Move Disc 1 From A To B

 ,  , [] , Move Disc 2 From A To C

[] ,  ,  , Move Disc 1 From B To C

[] , [] ,  , Total Moves = 3

Enter the number of discs (-1 to exit): 3

 , [] , [] , Move Disc 1 From A To C

 , [] ,  , Move Disc 2 From A To B

 ,  ,  , Move Disc 1 From C To B

 ,  , [] , Move Disc 3 From A To C

[] ,  ,  , Move Disc 1 From B To A

 ,  ,  , Move Disc 2 From B To C

 , [] ,  , Move Disc 1 From A To C

[] , [] ,  , Total Moves = 7

Enter the number of discs (-1 to exit): 4

 , [] , [] , Move Disc 1 From A To B

 ,  , [] , Move Disc 2 From A To C

 ,  ,  , Move Disc 1 From B To C

 , [] ,  , Move Disc 3 From A To B

 ,  ,  , Move Disc 1 From C To A

 ,  ,  , Move Disc 2 From C To B

 ,  , [] , Move Disc 1 From A To B

 ,  , [] , Move Disc 4 From A To C

[] ,  ,  , Move Disc 1 From B To C

[] ,  ,  , Move Disc 2 From B To A

 ,  ,  , Move Disc 1 From C To A

 ,  ,  , Move Disc 3 From B To C

 , [] ,  , Move Disc 1 From A To B

 ,  ,  , Move Disc 2 From A To C

[] ,  ,  , Move Disc 1 From B To C

[] , [] ,  , Total Moves = 15

Enter the number of discs (-1 to exit): 5

 , [] , [] , Move Disc 1 From A To C

 , [] ,  , Move Disc 2 From A To B

 ,  ,  , Move Disc 1 From C To B

 ,  , [] , Move Disc 3 From A To C

 ,  ,  , Move Disc 1 From B To A

 ,  ,  , Move Disc 2 From B To C

 , [] ,  , Move Disc 1 From A To C

 , [] ,  , Move Disc 4 From A To B

 ,  ,  , Move Disc 1 From C To B

 ,  ,  , Move Disc 2 From C To A

 ,  ,  , Move Disc 1 From B To A

 ,  ,  , Move Disc 3 From C To B

 ,  , [] , Move Disc 1 From A To C

 ,  ,  , Move Disc 2 From A To B

 ,  ,  , Move Disc 1 From C To B

 ,  , [] , Move Disc 5 From A To C

[] ,  ,  , Move Disc 1 From B To A

 ,  ,  , Move Disc 2 From B To C

 ,  ,  , Move Disc 1 From A To C

[] ,  ,  , Move Disc 3 From B To A

 ,  ,  , Move Disc 1 From C To B

 ,  ,  , Move Disc 2 From C To A

 ,  ,  , Move Disc 1 From B To A

 ,  ,  , Move Disc 4 From B To C

 , [] ,  , Move Disc 1 From A To C

 , [] ,  , Move Disc 2 From A To B

 ,  ,  , Move Disc 1 From C To B

 ,  ,  , Move Disc 3 From A To C

[] ,  ,  , Move Disc 1 From B To A

 ,  ,  , Move Disc 2 From B To C

 , [] ,  , Move Disc 1 From A To C

[] , [] ,  , Total Moves = 31

Enter the number of discs (-1 to exit): 6

 , [] , [] , Move Disc 1 From A To B

 ,  , [] , Move Disc 2 From A To C

 ,  ,  , Move Disc 1 From B To C

 , [] ,  , Move Disc 3 From A To B

 ,  ,  , Move Disc 1 From C To A

 ,  ,  , Move Disc 2 From C To B

 ,  , [] , Move Disc 1 From A To B

 ,  , [] , Move Disc 4 From A To C

 ,  ,  , Move Disc 1 From B To C

 ,  ,  , Move Disc 2 From B To A

 ,  ,  , Move Disc 1 From C To A

 ,  ,  , Move Disc 3 From B To C

 , [] ,  , Move Disc 1 From A To B

 ,  ,  , Move Disc 2 From A To C

 ,  ,  , Move Disc 1 From B To C

 , [] ,  , Move Disc 5 From A To B

 ,  ,  , Move Disc 1 From C To A

 ,  ,  , Move Disc 2 From C To B

 ,  ,  , Move Disc 1 From A To B

 ,  ,  , Move Disc 3 From C To A

 ,  ,  , Move Disc 1 From B To C

 ,  ,  , Move Disc 2 From B To A

 ,  ,  , Move Disc 1 From C To A

 ,  ,  , Move Disc 4 From C To B

 ,  , [] , Move Disc 1 From A To B

 ,  , [] , Move Disc 2 From A To C

 ,  ,  , Move Disc 1 From B To C

 ,  ,  , Move Disc 3 From A To B

 ,  ,  , Move Disc 1 From C To A

 ,  ,  , Move Disc 2 From C To B

 ,  , [] , Move Disc 1 From A To B

 ,  , [] , Move Disc 6 From A To C

[] ,  ,  , Move Disc 1 From B To C

[] ,  ,  , Move Disc 2 From B To A

 ,  ,  , Move Disc 1 From C To A

 ,  ,  , Move Disc 3 From B To C

 ,  ,  , Move Disc 1 From A To B

 ,  ,  , Move Disc 2 From A To C

[] ,  ,  , Move Disc 1 From B To C

[] ,  ,  , Move Disc 4 From B To A

 ,  ,  , Move Disc 1 From C To A

 ,  ,  , Move Disc 2 From C To B

 ,  ,  , Move Disc 1 From A To B

 ,  ,  , Move Disc 3 From C To A

 ,  ,  , Move Disc 1 From B To C

 ,  ,  , Move Disc 2 From B To A

 ,  ,  , Move Disc 1 From C To A

 ,  ,  , Move Disc 5 From B To C

 , [] ,  , Move Disc 1 From A To B

 ,  ,  , Move Disc 2 From A To C

 ,  ,  , Move Disc 1 From B To C

 , [] ,  , Move Disc 3 From A To B

 ,  ,  , Move Disc 1 From C To A

 ,  ,  , Move Disc 2 From C To B

 ,  ,  , Move Disc 1 From A To B

 ,  ,  , Move Disc 4 From A To C

[] ,  ,  , Move Disc 1 From B To C

[] ,  ,  , Move Disc 2 From B To A

 ,  ,  , Move Disc 1 From C To A

 ,  ,  , Move Disc 3 From B To C

 , [] ,  , Move Disc 1 From A To B

 ,  ,  , Move Disc 2 From A To C

[] ,  ,  , Move Disc 1 From B To C

[] , [] ,  , Total Moves = 63

Enter the number of discs (-1 to exit): -1

Good Bye!