Башни Ханоя, с каждым показанным движением

Мне нужно написать рекурсивную программу «Ханойские башни», что я и сделал, но она должна выводить позиции дисков, представленных звездами, и это то, с чем у меня проблемы. Он должен выводить графическое представление местоположения дисков каждый раз, когда выполняется движение. Я написал код для этого на 3 дисках, но мне нужно, чтобы он был более гибким и работал на 3, 4 или 5. Вот код, который у меня есть.

// This program displays a solution to the Towers of
// Hanoi game.
#include <iostream>
using namespace std;

// Function prototype
void moveDiscs(int, int, int, int, int);

int main()
{
int count = 0;
int NUM_DISCS = 3;   // Number of discs to move
const int FROM_PEG = 1;    // Initial "from" peg
const int TO_PEG = 3;      // Initial "to" peg
const int TEMP_PEG = 2;    // Initial "temp" peg

// Play the game.
moveDiscs(NUM_DISCS, FROM_PEG, TO_PEG, TEMP_PEG, count);
cout << "All the pegs are moved!\n";

system("PAUSE");
return 0;
}

//***************************************************
// The moveDiscs function displays a disc move in   *
// the Towers of Hanoi game.                        *
// The parameters are:                              *
//    num:     The number of discs to move.         *
//    fromPeg: The peg to move from.                *
//    toPeg:   The peg to move to.                  *
//    tempPeg: The temporary peg.                   *
//***************************************************

void moveDiscs(int num, int fromPeg, int toPeg, int tempPeg, int count)
{
if (num > 0)
{
moveDiscs(num - 1, fromPeg, tempPeg, toPeg, count);
cout << "Move a disc from peg " <<fromPeg
<< " to peg " << toPeg <<endl;
count++;
if (fromPeg == 1 && toPeg == 3)
{
if (num == 1)
{
if(count == 3)
cout<<"       *"<<endl<< "       *"<<endl<< "       *"<<endl;
else
cout << "*"<< endl <<"*      *"<<endl;
}
else
cout << "   *"<<endl <<"   *   *"<<endl;
}
if (fromPeg==1 && toPeg==2)
cout << "*  *  *"<<endl;
if (fromPeg ==3 && toPeg==2)
cout << "   *"<<endl <<"*  *"<<endl;
if (fromPeg==2 && toPeg==1)
cout << "*  *  *"<<endl;
if (fromPeg==2 && toPeg==3)
cout << "       *"<< endl <<"*      *"<<endl;
moveDiscs(num - 1, tempPeg, toPeg, fromPeg, count);
}
}

-2

Решение

Хотя это и не является прямым ответом на ваш вопрос — я думаю, вы можете найти его полезным. я сделал Башни Ханоя пример некоторое время назад:

LIVE DEMO

#include <algorithm>
#include <iterator>
#include <iostream>
#include <ostream>
#include <vector>

using namespace std;

using HanoiPin = vector<unsigned>;

template<class PostAction>
void move_hanoi
(
HanoiPin &from, HanoiPin &to, HanoiPin &temp,
size_t count, PostAction post
)
{
if(count>1)
{
move_hanoi(from, temp, to, count-1, post);
move_hanoi(from, to, temp, 1, post);
move_hanoi(temp, to, from, count-1, post);
}
else
{
to.push_back(from.back());
from.pop_back();
post();
}
}

int main()
{
auto count=5;
HanoiPin a,b,c;
generate_n(back_inserter(a), count, [=]() mutable
{
return count--;
});
auto print_hanoi=[](HanoiPin &h)
{
cout << "|";
for(auto x : h)
cout << x << "-";
cout << endl;
};
auto printer=[&]
{
print_hanoi(a);
print_hanoi(b);
print_hanoi(c);
cout << endl;
};
printer();
move_hanoi(a,b,c,a.size(),printer);
}

Выход:

|5-4-3-2-1-
|
|

|5-4-3-2-
|1-
|

|5-4-3-
|1-
|2-

|5-4-3-
|
|2-1-

|5-4-
|3-
|2-1-

|5-4-1-
|3-
|2-

|5-4-1-
|3-2-
|

|5-4-
|3-2-1-
|

|5-
|3-2-1-
|4-

|5-
|3-2-
|4-1-

|5-2-
|3-
|4-1-

|5-2-1-
|3-
|4-

|5-2-1-
|
|4-3-

|5-2-
|1-
|4-3-

|5-
|1-
|4-3-2-

|5-
|
|4-3-2-1-

|
|5-
|4-3-2-1-

|1-
|5-
|4-3-2-

|1-
|5-2-
|4-3-

|
|5-2-1-
|4-3-

|3-
|5-2-1-
|4-

|3-
|5-2-
|4-1-

|3-2-
|5-
|4-1-

|3-2-1-
|5-
|4-

|3-2-1-
|5-4-
|

|3-2-
|5-4-1-
|

|3-
|5-4-1-
|2-

|3-
|5-4-
|2-1-

|
|5-4-3-
|2-1-

|1-
|5-4-3-
|2-

|1-
|5-4-3-2-
|

|
|5-4-3-2-1-
|
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]