2017-03-05 1 views
0

하노이 타워 프로그램을 작성했지만 재귀 때문에 출력이 A, B 및 C 필러를 전환합니다. 애니메이션을 만들기 위해 기둥을 유지할 수있는 방법이 있습니까? 내 코드 :재귀 하노이 타워에서 어떻게 3 개의 배열 (기둥)을 순서대로 유지할 수 있습니까?

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

이 재귀 당신이

관련 문제