Типография Ханой (со ступенями и башнями) - PullRequest
0 голосов
/ 18 октября 2018

Итак, я пробую свои силы в создании рекурсивной функции для решения Ханойских Башен.Я считаю, что у меня есть суть цикла, и я могу распечатать то, что двигалось, а также простой текстовый рисунок с 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 . . .

Требуется минимальное количество ходов для решения головоломки, но, глядя на вывод, это явно не так.

По сути, мои вопросы таковы: что вызывает изменение номеров дисков?Что-то явно не так, что я пропустил?А также, есть ли способ лучше оптимизировать мой код?

Кроме того, это задание для класса, который я беру.поэтому советы и подсказки будут с благодарностью.

Спасибо всем, кто откликнется.

...