2016-03-08 138 views
-1
.  *** * | 
***** * *** *** | 
    * *  | 
* * * ** **O** | 
* * * * | 
********** *** | 
    * *  **| 
** * ** * | 

你好傢伙,我剛開始學習遞歸,我有點困惑,我的意思是,我有這個8x16迷宮(忽略右側的酒吧)的起始位置迷宮是0,0,你可以在迷宮裏出來,我從那裏得到在C++中的遞歸的方式,「O」點,到目前爲止,我已經嘗試過這種瞭解遞歸C++

bool Laberinto::findPath(int x,int y){ 

//outside limits bounds 
if(x < 0 || x > nRows || y < 0 || y > nCol) 
    return false; 

//if goal 
if(x == goalRow && y == goalCol){ 
    updateLab(); 
    return true; 
} 

//if obstacle 
if(matrix[x][y] == '*' || matrix[x][y] == 'X'){ 
    return false; 
} 

matrix[x][y] = '.'; 
updateLab(); 

//North checking 
if(findPath(x-1,y) == true){ 
    return true; 
} 
//East checking 
if(findPath(x,y+1) == true){ 
    return true; 
} 
//South checking 
if(findPath(x+1,y) == true){ 
    return true; 
} 
//West checking 
if(findPath(x,y-1) == true){ 
    return true; 
} 

matrix[x][y] = 'X'; 
updateLab(); 
return false; 

} 

updateLab()只打印迷宮,東西是它到了東邊直到它找到了一個障礙,然後一直往南走,直到它崩潰,但是因爲我剛剛開始學習遞歸,所以我沒有看到我的錯誤發生在哪裏

........*** * | 
***** *.*** *** | 
    * *  | 
* * * ** **O** | 
* * * * | 
********** *** | 
    * *  **| 
** * ** * | 
+0

'goalCol'和'goalRow'從哪裏來? – Michael

+3

通過在調試器中運行以捕獲實際崩潰並瞭解代碼發生的位置。 –

+1

你的問題不是遞歸,這是相當微不足道的,我建議你的關注你把注意力集中在錯誤的事情上。只需調試你的代碼。由於遞歸,你很可能會崩潰。 – CarlH

回答

3

您需要包含代碼以避免您已經走過的路徑。

if(matrix[x][y] == '.') /*....*/ 

什麼是可能發生的事情是你要停留在這兩個點是北部和對方的南部,因爲你的代碼進入一個無限循環一遍又一遍動大江南北。

+0

如果朝某個方向(錯誤的方向)發生了什麼,然後必須回去繼續檢查迷宮? – Nadir

+1

@Nadir它是遞歸的,所以堆棧最終應該回彈而不必擔心。但是用戶得到堆棧溢出是因爲他們一遍又一遍地上下移動,每次都輸入新的堆棧幀,直到程序崩潰。 – Xirema

+0

你是對的,用戶一直往南走<-> north – Nadir