2013-03-14 38 views
0

當運行我的數獨生成器時,27次堆棧溢出後。27次運行後的StackOverflow

void start(int todel){ 
int number; 
for (int x=0; x<9; x++) { 
    for (int y=0; y<9; y++) { 

     number = GenN(x, y); 
     osudoku[x][y]=number; 
    } 
} 
replace(todel); 
output(); 
} 


int GenZ(int x, int y){ 
    int number; 
    bool duplication = true; 
    Randomize(); 
    number = Random(9)+1; 
    duplication = check(number,x,y); 
    if (duplication==true){ 
     return GenZ(x,y); 
    } 
    else if (duplication==false) { 
     return number; 
    } 
} 

我認爲它與這段代碼的東西。 它產生的東西,如:

758 431 629 
913 267 485 
642 985 317 
Stack Overflow 

所以我得到1/3數獨。

+0

請用所用語言標記。 – Dukeling 2013-03-14 07:42:07

+0

提供堆棧跟蹤 – 2013-03-14 07:42:26

+0

不應該將'number'分配給某個東西嗎? 'zahl'從哪裏來? – Thilo 2013-03-14 07:45:27

回答

2

您需要將backtracking添加到您的解決方案。

考慮這種情況:(可能在你的算法某些點發生)

1 2 3 | 4 5 6 | 7 8 9 
4 5 6 | 1 2 3 | ? _ _ 
... 

你的程序將只保留試圖找到一個適合在?值,但不存在這樣的值。

相反,你的程序需要看有沒有適合的值,並嘗試3,這也將無法正常工作,那麼2,然後1在這種情況下,它應該最終把789在不同的值第二塊如:

1 2 3 | 4 5 6 | 7 8 9 
4 5 6 | 7 8 9 | ? _ _ 
... 

在這種情況下,它可以繼續成功。

這:

zahl = Random(9)+1; 

將沒有真正的工作,你可以不斷獲取,不適合的值(如上面的例子)。你不知道什麼時候回去。循環遍歷所有9個值更好。在你完成所有9個值後,你會知道沒有任何價值,你就會知道你必須回溯。

+0

+1。你必須遍歷所有的數字,否則即使你生成所有的數字,你也沒有退出標準(當沒有數字適合了)。 – Thilo 2013-03-14 08:14:37

0

如果GenZ中的重複== true,它會用相同的x,y再次調用它,這又會產生重複== true?尤其是因爲我看不到你修改「數字」,所以它可能是在它的初始值一樣0

+1

我不能看到一個轉讓「號碼」,隨機號碼分配給「zahl」 – 2013-03-14 07:45:15

+0

哦,對不起,我沒有取代。 – user2168703 2013-03-14 07:50:10

0
if (duplication==true){ 
    return GenZ(x,y); 
} 

我不知道這是創建一個數獨的可行方法,暴力破解可能需要而不管你如何實現它,但你可能通過不使用遞歸和循環來擺脫掉stackoverflow錯誤。

while (duplication){ 
+0

我已經試過了,但不會工作 – user2168703 2013-03-14 14:47:06

相關問題