Итак, я пробую свои силы в создании рекурсивной функции для решения Ханойских Башен.Я считаю, что у меня есть суть цикла, и я могу распечатать то, что двигалось, а также простой текстовый рисунок с 3 башнями.
Вот мой код: он включает в себя класс Tower, которыйЯ сделал так, чтобы можно было печатать три башни на консоли.
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
class Tower
{
private:
string name;
vector<string> contents;
public:
Tower(string n)
{
this->name = n;
}
void setName(string n)
{
this->name = n;
}
string getName()
{
return this->name;
}
void setVectorSize(int size)
{
contents.resize(size);
}
void pushDisk(string val)
{
this->contents.push_back(val);
}
void popDisk()
{
this->contents.pop_back();
}
string printTower()
{
string output = "Tower " + this->name + ": ";
for (string disk : contents)
{
output += disk + " ";
}
return output;
}
void clearContents()
{
contents.clear();
}
};
void towersOfHanoi(int, Tower*, Tower*, Tower*);
string orderedTowers(Tower*, Tower*, Tower*);
int main()
{
int diskNum;
char ans;
bool run = true;
auto tower1 = new Tower("1");
auto tower2 = new Tower("2");
auto tower3 = new Tower("3");
do
{
cout << "How many disks would you like to use (positive integers only): ";
cin >> diskNum;
while (diskNum < 1)
{
cout << "\nThe number of disks must be a positive integer.\n"
<< "How many disks would you like to use (positive integers only): ";
cin >> diskNum;
}
cout << endl << pow(2, diskNum) - 1 << " moves are needed to solve for " << diskNum << " disk(s).\n";
//tower1->setVectorSize(diskNum);
//tower2->setVectorSize(diskNum);
//tower3->setVectorSize(diskNum);
for (int i = diskNum; i > 0; i--)
{
string c = to_string(i);
tower1->pushDisk(c);
}
cout << orderedTowers(tower1, tower2, tower3) << endl;
system("pause");
towersOfHanoi(diskNum, tower1, tower2, tower3);
cout << "\nWould you like to run again (Y/N): ";
cin >> ans;
if (toupper(ans) == 'Y')
{
run = true;
system("cls");
tower1->clearContents();
tower2->clearContents();
tower3->clearContents();
}
else if (toupper(ans) == 'N')
{
run = false;
}
} while (run == true);
return 0;
}
void towersOfHanoi(int disks, Tower* t1, Tower* t2, Tower* t3)
{
if (disks != 0)
{
towersOfHanoi(disks - 1, t1, t3, t2);
cout << "\nMove disk " << disks << " from tower " << t1->getName() << " to tower " << t2->getName() << endl;
t1->popDisk();
t2->pushDisk(to_string(disks));
cout << orderedTowers(t1, t2, t3) << endl;
system("pause");
towersOfHanoi(disks - 1, t2, t1, t3);
}
}
string orderedTowers(Tower* t1, Tower* t2, Tower* t3)
{
string output;
if (t1->getName() == "1")
output += t1->printTower() + "\n";
else if(t2->getName() == "1")
output += t2->printTower() + "\n";
else if (t3->getName() == "1")
output += t3->printTower() + "\n";
if (t1->getName() == "2")
output += t1->printTower() + "\n";
else if (t2->getName() == "2")
output += t2->printTower() + "\n";
else if (t3->getName() == "2")
output += t3->printTower() + "\n";
if (t1->getName() == "3")
output += t1->printTower() + "\n";
else if (t2->getName() == "3")
output += t2->printTower() + "\n";
else if (t3->getName() == "3")
output += t3->printTower() + "\n";
return output;
}
Однако у меня возникла проблема с программой, которая на самом деле решает головоломку: бывают случаи, когда я перемещаю диск,номер определенного диска будет уменьшен на единицу.
Например, выход для 3 дисков будет:
How many disks would you like to use (positive integers only): 3
7 moves are needed to solve for 3 disk(s).
Tower 1: 3 2 1
Tower 2:
Tower 3:
Press any key to continue . . .
Move disk 1 from tower 1 to tower 2
Tower 1: 3 2
Tower 2: 1
Tower 3:
Press any key to continue . . .
Move disk 2 from tower 1 to tower 3
Tower 1: 3
Tower 2: 1
Tower 3: 2
Press any key to continue . . .
Move disk 1 from tower 3 to tower 1
Tower 1: 3 1
Tower 2: 1
Tower 3:
Press any key to continue . . .
Move disk 3 from tower 1 to tower 2
Tower 1: 3
Tower 2: 1 3
Tower 3:
Press any key to continue . . .
Move disk 1 from tower 2 to tower 3
Tower 1: 3
Tower 2: 1
Tower 3: 1
Press any key to continue . . .
Move disk 2 from tower 2 to tower 1
Tower 1: 3 2
Tower 2:
Tower 3: 1
Press any key to continue . . .
Move disk 1 from tower 1 to tower 2
Tower 1: 3
Tower 2: 1
Tower 3: 1
Press any key to continue . . .
Требуется минимальное количество ходов для решения головоломки, но, глядя на вывод, это явно не так.
По сути, мои вопросы таковы: что вызывает изменение номеров дисков?Что-то явно не так, что я пропустил?А также, есть ли способ лучше оптимизировать мой код?
Кроме того, это задание для класса, который я беру.поэтому советы и подсказки будут с благодарностью.
Спасибо всем, кто откликнется.