2012-10-23 241 views
0

我正在嘗試在我的程序中使用output multiple sudoku solutions。例如,當您輸入以下內容作爲輸入時:需要多個數獨解決方案

8..6..9.5.............2.31...7318.6.24.....73...........279.1..5...8..36..3...... 

.'s表示空格。數字代表已經填滿的空格。輸出應該是這樣的數獨解決方案:

814637925325149687796825314957318462241956873638274591462793158579481236183562749 

但是,我想輸出多個解決方案。這將是所有應該打印的解決方案:

814637925325149687796825314957318462241956873638274591462793158579481236183562749 
814637925325941687796825314957318462241569873638472591462793158579184236183256749 
834671925125839647796425318957318462241956873368247591682793154579184236413562789 
834671925125839647796524318957318462241956873368247591682793154519482736473165289 
834671925125839647796524318957318462241965873368247591682793154519482736473156289 

但我的程序只打印出一個解決方案。 任何人都可以幫我想出一種打印出多種解決方案的方法嗎?謝謝。

+1

維基百科說數獨謎題通常只有一個解決方案。 –

+0

那麼我想測試多種解決方案謎題 – user1567909

+0

有趣的算法。我懷疑解決辦法是將你的最後一個'return true'改爲告訴其他應用程序'處於我的狀態,k = 4是一個有效的答案',然後繼續檢查k = 5-9。當然,要做到這一點,您必須存儲多個板狀態,而不是僅僅修改原來的'arr'板。 @naysayers ......「通常」只有一個解決方案。 – Rollie

回答

1

你不應該回到這裏:

if(testTheNumber(arr, row, column+1)==true) 
    { 
    return true; 
    } 

而應該讓算法嘗試所有可能的k值。 而且您應該只在最後打印解決方案(當您找到所有數字時)。

+0

所以我只需要打印行== 9時? – user1567909

1

您可以通過簡單地在找到解決方案時不停止遞歸來做到這一點。例如,像:

if (row == 9) { 
    // print solution here 
    return true; 
} 

和刪除其他return true;,只是遞歸:

testTheNumber(arr, row, column+1); 

以上將停止遞歸,當你找到一個解決方案(以到達最終行),並且將在那之後也繼續嘗試更多的數字。

此外,您可能在if(k == 10)部分有一個錯誤,因爲k在此時不應該爲10。您需要將k循環中的單元格設置爲0。

+0

所以,我會簡單地打印後行== 9,然後返回true?然後刪除testTheNumber(arr,row,column + 1)是否返回true? – user1567909

+0

那麼不要刪除遞歸調用,只是'if'部分和'return true'部分。 –

+0

但是因爲我的函數是一個布爾函數,我不需要某種布爾來評估函數嗎?或者我會簡單地把return testNumber(arr,row,column + 1);? – user1567909