我是C++的新手,必須做一個家庭作業(數獨)。我被困在一個問題上。C++ - 解決數獨遊戲
問題是要實現一個解決數獨的搜索功能。
指令: 爲了找到解決方案遞歸搜索使用如下。假設有一個 尚未分配字段的數字(d1 .... dn)(n> 1)。然後我們首先嚐試 將字段賦值給d1,執行傳播,然後遞歸地繼續搜索 。 可能發生的情況是傳播導致失敗(一個字段變爲 爲空)。在這種情況下,搜索失敗,需要嘗試不同的數字作爲 字段之一。由於搜索是遞歸的,因此嘗試了最後一個 考慮的字段的下一個數字。如果沒有數字導致解決方案,搜索將再次失敗。這在 轉,將導致嘗試從以前的領域不同的數字,等等。
一個數字d之前被分配領域 它試圖,你必須創建一個新的董事會被現任董事會的一個副本(使用 拷貝構造函數和新堆中分配的板)。只有 然後在副本上執行分配。如果搜索 的遞歸調用返回失敗,則可嘗試爲下一個數字創建新的電路板 。
我已經試過:
// Search for a solution, returns NULL if no solution found
Board* Board::search(void) {
// create a copy of the cur. board
Board *copyBoard = new Board(*this);
Board b = *copyBoard;
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
// if the field has not been assigned, assign it with a digit
if(!b.fs[i][j].assigned()){
digit d = 1;
// try another digit if failed to assign (1 to 9)
while (d <=9 && b.assign(i, j, d) == false){
d++;
// if no digit matches, here is the problem, how to
// get back to the previous field and try another digit?
// and return null if there's no pervious field
if(d == 10){
...
return NULL;
}
}
}
}
return copyBoard;
}
的另一個問題是在哪裏使用遞歸調用?有小費嗎?謝謝!
完整的指令能夠被發現這裏:http://www.kth.se/polopoly_fs/1.136980!/Menu/general/column-content/attachment/2-2.pdf
代碼:http://www.kth.se/polopoly_fs/1.136981!/Menu/general/column-content/attachment/2-2.zip
你有什麼想法在這一點遞歸,以及如何使用它? –