2015-09-25 46 views
-1

因此,我需要使用堆棧解決N-Queens *問題。調試C++期間的分段錯誤

* N皇后問題:你有一個N行/列/皇后棋盤。您必須放置每個皇后,以便它不會攻擊棋盤上的其他任何棋子。

我創建了一個Queen類,用於存儲每個放置的有效皇后的行和列位置,並且工作正常。據我所知,我所有的排序和檢查邏輯也很好。但是,無論是在主或我的求解功能,我得到一個分段錯誤,但只有當我調試。當正常運行時,它就會退出。不幸的是,我的調試器不能讓我一行一行,但我已經手動完成,仍然無法弄清楚。

void solve(int k, int N) 
{ 
stack<Queen> queenStack; 
if(k == N) 
    { 
    while(!queenStack.empty()) 
     { 
     cout << queenStack.top().rowPos << ", " << queenStack.top().colPos << endl; 
     queenStack.pop(); 
     }//end while 
    }//endif 

else 
    { 
    for (int i = 0;i < N; i++) 
     { 
     if (isSafe(k,i)) 
      { 
      Queen queen(k,i); 
      queenStack.push(queen); 
      solve(k++,N); 
      }//end if 
     else 
      { 
      if(queenStack.empty()) 
       { 
       break; 
       }//end if 
      else 
       { 
       queenStack.pop(); 
       k--; 
       }//end else 
      }//end else 
     }//end for 
    }//end else 
}//end void 

那麼我的主要:

int main() 
{ 
int N = 0; 
cout << "Please pick an integer 3 or greater and less than whatever you think won't crash your computer." << endl; 
cin >> N; 
while (N < 3) 
    { 
    cout << "Please pick an integer 3 or greater and less than whatever you think won't crash your computer." << 
    endl; 
    cin >> N; 
    }//end while 
solve(0,N); 
return 0; 
}//end main 

我ifSafe是布爾函數只是做基於行的檢查,這是我傳遞作爲一個int,然後返回真/假的循環。

+0

'queenStack'是'solve'函數的本地對象。在遞歸之前添加它並不會影響該調用。 –

+0

所以我需要在main中創建堆棧,將它傳遞給函數,然後使用函數添加到它中?如果我理解正確。 – MathiasOrdun

回答

0

首先,代碼中存在一個明顯的問題,會立即導致堆棧溢出。您遞歸調用的方式解決您的功能:

solve(k++,N); 

會先調用solve,然後遞增k。所以solve(0, N)調用solve(0, N),而這又調用solve(0, N)導致堆棧溢出。沒有任何副作用或任何影響solve的外部變量,並使其行爲與相同的參數不同。

我不完全理解您的解決方案,所以我不能告訴您如何解決這個問題,但最有可能您的意圖是queenStack在通話中可見,在這種情況下,全球,或通過引用將其傳遞到solve

現在爲什麼它在調試器之外運行時就完成了。我的猜測是你會使用某種非Windows系統(mac或linux)並從終端運行它。這樣程序仍然崩潰,但沒有以任何明顯的方式顯示它。看它是否成功完成的方式是執行程序後打印$?

[email protected]:~$ ./crash_me 
[email protected]:~$ echo $? 
1 

如果程序正常執行,返回代碼應該是零。