В рекурсивной Ханойской башне, как я могу поддерживать три массива (колонны) в порядке?

Я написал программу Hanoi Tower, но выход переключает колонны A, B и C из-за рекурсии. Есть ли способ сохранить колонны, чтобы сделать анимацию?
Мой код:

#include <iostream>
#include <vector>
#include <stdlib.h>
#include <windows.h>
using namespace std;

void printTowers(vector<int>& arr1, vector<int>& arr2, vector<int>& arr3)
{
printOut(arr1); //prints vector using iterator
printOut(arr2);
printOut(arr3);
}
//------------
//  hanoi(number of disks, source pillar, spare pillar, target pillar)
void hanoi(int d, vector<int>& a, vector<int>& b, vector<int>& c)
{
if(d == 1)
{
c.push_back(a.back());
a.pop_back();
printTowers(a,b,c);
}
else{
hanoi(d-1,a,c,b);
hanoi(1,a,b,c);
hanoi(d-1,b,a,c);
}
}
//------------
int main()
{
int n = 3;
vector <int> A, B, C;
A.reserve(n); B.reserve(n); C.reserve(n);

for(int i=0; i<n; i++)
{
A.push_back(n-i);
}
hanoi(n,A,B,C);
return 0;
}

Образец вывода:

 321 | 32 | 3  |    |    | 2  |    |    |
|    | 1  | 3  | 21 | 3  | 1  |    |
| 1  | 2  | 21 | 3  | 1  | 32 | 321|

Желаемый результат:

 321 | 32 | 3  | 3  |    | 1  | 1  |    |
|    | 2  | 21 | 21 | 2  |    |    |
| 1  | 1  |    | 3  | 3  | 32 | 321|

0

Решение

Вы можете использовать дополнительную ячейку в вашем векторе, которая скажет вам, что это за столб. Например

vector <int> A, B, C;
A.reserve(n+1); B.reserve(n+1); C.reserve(n+1);
A.push_back(-1);
B.push_back(-2);
C.push_back(-3);

Сейчас

//add a new function to simplify code
void printTowerId(vector<int>& arr1, vector<int>& arr2, vector<int>& arr3, int id){
if(arr1[0] == id) printOut(arr1);
if(arr2[0] == id) printOut(arr2);
if(arr3[0] == id) printOut(arr3);
}

И ваша оригинальная функция выглядит так

void printTowers(vector<int>& arr1, vector<int>& arr2, vector<int>& arr3)
{
printTowerId(arr1, arr2, arr3, -1);
printTowerId(arr1, arr2, arr3, -2);
printTowerId(arr1, arr2, arr3, -3);
}

Позаботьтесь о том, чтобы ваша рекурсия не занимала ячейку, которую вы добавили

0

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

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

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