Мне нужно написать рекурсивную программу «Ханойские башни», что я и сделал, но она должна выводить позиции дисков, представленных звездами, и это то, с чем у меня проблемы. Он должен выводить графическое представление местоположения дисков каждый раз, когда выполняется движение. Я написал код для этого на 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);
}
}
Хотя это и не является прямым ответом на ваш вопрос — я думаю, вы можете найти его полезным. я сделал Башни Ханоя пример некоторое время назад:
#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-
|
Других решений пока нет …