mirror of
https://hub.njuu.cf/TheAlgorithms/C-Plus-Plus.git
synced 2023-10-11 13:05:55 +08:00
document towers of hanoi
This commit is contained in:
parent
f0ab5e8898
commit
1e5f97c042
@ -1,48 +1,58 @@
|
||||
/**
|
||||
* @file
|
||||
* @brief Solve the [Tower of
|
||||
* Hanoi](https://en.wikipedia.org/wiki/Tower_of_Hanoi) problem.
|
||||
*/
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
struct tower
|
||||
{
|
||||
/**
|
||||
* 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";
|
||||
/** Display the towers */
|
||||
void show() {
|
||||
std::cout << "\n\n\tF : ";
|
||||
for (int i = 0; i < F.top; i++) {
|
||||
std::cout << F.values[i] << "\t";
|
||||
}
|
||||
cout << "\n\tU : ";
|
||||
for (int i = 0; i < U.top; i++)
|
||||
{
|
||||
cout << U.values[i] << "\t";
|
||||
std::cout << "\n\tU : ";
|
||||
for (int i = 0; i < U.top; i++) {
|
||||
std::cout << U.values[i] << "\t";
|
||||
}
|
||||
cout << "\n\tT : ";
|
||||
for (int i = 0; i < T.top; i++)
|
||||
{
|
||||
cout << T.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)
|
||||
{
|
||||
/** 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)
|
||||
{
|
||||
/**
|
||||
* 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
|
||||
{
|
||||
} else {
|
||||
TH(n - 1, From, To, Using);
|
||||
mov(From, To);
|
||||
show();
|
||||
@ -50,21 +60,20 @@ void TH(int n, tower &From, tower &Using, tower &To)
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
/** Main function */
|
||||
int main() {
|
||||
F.top = 0;
|
||||
U.top = 0;
|
||||
T.top = 0;
|
||||
|
||||
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--)
|
||||
{
|
||||
for (int i = no; i > 0; i--) {
|
||||
F.values[F.top++] = i;
|
||||
};
|
||||
}
|
||||
|
||||
show();
|
||||
TH(no, F, U, T);
|
||||
|
Loading…
Reference in New Issue
Block a user