2017-08-02 72 views
-2

因此,我有一個程序,顯示解決河內拼圖的模擬。我的程序大部分工作正常,但不會在應該時終止。一旦所有光盤都在C釘(C C C)上,它應該終止,但是我的光盤仍然是第四張沒有給出的光盤。應該只有三個光盤。任何幫助,將不勝感激!解決河內拼圖遞歸

#include <iostream> 
using namespace std; 

const int num = 3; 
const char from_peg = 'A'; 
const char to_peg = 'B'; 
const char temp_peg = 'C'; 

char position[num]; 
void moveDiscs(int num,int disc,char source,char dest, char spare){ 
    if (disc == 0){ 
     position[disc]=dest; 
     cout<<"Moved disc "<<disc+1<<" to peg "<<dest; 
     cout<<" ("; 
     for(int i = 0;i<num;i++){ 
      cout<<position[i]<<" "; 
     } 
     cout<<")"<<endl; 
    }else{ 
     moveDiscs(num,disc-1,source,spare,dest); 
     position[disc]=dest; 
     cout<<"Moved disc "<<disc+1<<" to peg "<<dest; 
     cout<<" ("; 
       for(int i = 0;i<num;i++){ 
        cout<<position[i]<<" "; 
       } 
       cout<<")"<<endl; 
     moveDiscs(num,disc-1,spare,dest,source); 
    } 
} 
int main() { 

    cout<<"Starting Position for 3 discs are ("; 
    for(int i = 0;i<num;i++){ 
     position[i]='A'; 
     cout<<position[i]<<" "; 
    } 
    cout<<")"<<endl; 


    moveDiscs(3,3,from_peg,to_peg,temp_peg); 
    return 0; 
} 

輸出:

Starting Position for 3 discs are (A A A) 
Moved disc 1 to peg C (C A A) 
Moved disc 2 to peg B (C B A) 
Moved disc 1 to peg B (B B A) 
Moved disc 3 to peg C (B B C) 
Moved disc 1 to peg A (A B C) 
Moved disc 2 to peg C (A C C) 
Moved disc 1 to peg C (C C C) 
Moved disc 4 to peg B (C C C) 
Moved disc 1 to peg B (B C C) 
Moved disc 2 to peg A (B A C) 
Moved disc 1 to peg A (A A C) 
Moved disc 3 to peg B (A A B) 
Moved disc 1 to peg C (C A B) 
Moved disc 2 to peg B (C B B) 
Moved disc 1 to peg B (B B B) 
+0

'position [disc] = dest;'使用'main'中第一個調用的else區塊中的越界索引修改位置。 –

+0

看起來像if塊正在檢查光盤0-3,而在else中它最終輸出光盤+1。不會「給出」答案,但看看你如何比較光盤和輸出應該讓你走上正確的軌道。 – Das

+2

[不是矢量樂趣?](http://ideone.com/5MjTjb) - 問題的即時診斷。 – PaulMcKenzie

回答

0

由於@Das指出光盤從0開始,但你傳遞的discs = 3數總盤從03實際上是4(同樣的錯誤通常發生與數組長度)。您實際上應該設置discs等於2.