2017-03-05 101 views
0

我寫了一個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| 
+1

細胞是,使這個名字是每個支柱的一部分。 –

回答

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); 
} 

小心,在你的遞歸不佔用您添加