diff --git a/others/tower_of_hanoi.cpp b/others/tower_of_hanoi.cpp index 5783d6a98..d6c229617 100644 --- a/others/tower_of_hanoi.cpp +++ b/others/tower_of_hanoi.cpp @@ -1,73 +1,82 @@ +/** + * @file + * @brief Solve the [Tower of + * Hanoi](https://en.wikipedia.org/wiki/Tower_of_Hanoi) problem. + */ #include -using namespace std; -struct tower -{ - int values[10]; - int top; +/** + * Define the state of tower + */ +struct tower { + //! Values in the tower + int values[10]; + //! top tower ID + int top; } F, U, T; -void show() -{ - cout << "\n\n\tF : "; - for (int i = 0; i < F.top; i++) - { - cout << F.values[i] << "\t"; - } - cout << "\n\tU : "; - for (int i = 0; i < U.top; i++) - { - cout << U.values[i] << "\t"; - } - cout << "\n\tT : "; - for (int i = 0; i < T.top; i++) - { - cout << T.values[i] << "\t"; - } +/** Display the towers */ +void show() { + std::cout << "\n\n\tF : "; + for (int i = 0; i < F.top; i++) { + std::cout << F.values[i] << "\t"; + } + std::cout << "\n\tU : "; + for (int i = 0; i < U.top; i++) { + std::cout << U.values[i] << "\t"; + } + std::cout << "\n\tT : "; + for (int i = 0; i < T.top; i++) { + std::cout << T.values[i] << "\t"; + } } -void mov(tower &From, tower &To) -{ - --From.top; - To.values[To.top] = From.values[From.top]; - ++To.top; +/** Move one disc from one tower to another + * \param [in,out] From tower to move disk *from* + * \param [in,out] To tower to move disk *to* + */ +void mov(tower &From, tower &To) { + --From.top; + To.values[To.top] = From.values[From.top]; + ++To.top; } -void TH(int n, tower &From, tower &Using, tower &To) -{ - - if (n == 1) - { - mov(From, To); - show(); - } - else - { - TH(n - 1, From, To, Using); - mov(From, To); - show(); - TH(n - 1, Using, From, To); - } +/** + * Recursive algorithm to solve the puzzle + * \param [in] n starting number of disks + * \param [in,out] From tower to move disks from + * \param [in,out] Using temporary tower for the puzzle + * \param [in,out] To tower to move disk to + */ +void TH(int n, tower &From, tower &Using, tower &To) { + if (n == 1) { + mov(From, To); + show(); + } else { + TH(n - 1, From, To, Using); + mov(From, To); + show(); + TH(n - 1, Using, From, To); + } } -int main() -{ - F.top = 0; - U.top = 0; - T.top = 0; +/** Main function */ +int main() { + F.top = 0; + U.top = 0; + T.top = 0; - int no; + int no; - cout << "\nEnter number of discs : "; - cin >> no; + std::cout << "\nEnter number of discs : "; + std::cin >> no; - for (int i = no; i > 0; i--) - { - F.values[F.top++] = i; - }; + for (int i = no; i > 0; i--) { + F.values[F.top++] = i; + } - show(); - TH(no, F, U, T); + show(); + TH(no, F, U, T); - return 0; + return 0; }