C 解決數獨問題(回溯)

2021-09-12 02:18:31 字數 1398 閱讀 3926

參考鏈結來自於

輸入乙個數獨作為9*9的陣列,例如輸入乙個測試資料map[9][9]為:

0 9 0 0 0 0 0 6 0

8 0 1 0 0 0 5 0 9

0 5 0 3 0 4 0 7 0

0 0 8 0 7 0 9 0 0

0 0 0 9 0 8 0 0 0

0 0 6 0 2 0 7 0 0

0 8 0 7 0 5 0 4 0

2 0 5 0 0 0 8 0 7

0 6 0 0 0 0 0 9 0

解決思路為:設定乙個count來計數,當count=81的時候,遍歷完整個陣列,這時可以輸出結果;

從左上角的數字開始,如果該數為0,則在這個位置從1開始填,這時檢查填入的數字能否填入,1沒在第一行**現,也沒在第一列**現,但是在3*3的格仔**現了,則這個位置變為2;再次檢查2是否能填入,同理,發現也不能填入,則變成3,發現3可以填入。

以此類推,可以將第一行填滿。當遇到衝突發現不能填數字時,將該位置變成0,再返回上乙個數,將其+1;就是這樣乙個不斷試值不斷重複迭代,遇到衝突,返回糾錯然後再迭代的過程。

**理解:

void backtrace(int count) 

cout << endl;

} return;

} int row = count / 9;

int col = count % 9;

//如果該位置為0,

if (map[row][col] == 0)

}map[row][col] = 0;

} //如果該位置不為0,則直接對下個位置的進行操作

else

}

bool isplace(int count) 

} //判斷填入的數是否在該列

for (j = 0; j < 9; ++j) }

//判斷填入的數是否在3*3的小框中

int temprow = row / 3 * 3;

int tempcol = col / 3 * 3;

for (j = temprow; j < temprow + 3; ++j)

}} return true;

}

輸出為:

7 9 3 8 5 1 4 6 2

8 4 1 2 6 7 5 3 9

6 5 2 3 9 4 1 7 8

3 2 8 4 7 6 9 5 1

5 7 4 9 1 8 6 2 3

9 1 6 5 2 3 7 8 4

1 8 9 7 3 5 2 4 6

2 3 5 6 4 9 8 1 7

4 6 7 1 8 2 3 9 5

第一次寫blog,如有錯誤,請多指教!~

數獨問題(DFS 回溯)

數獨遊戲的規則是這樣的 在乙個9x9的方格中,你需要把數字1 9填寫到空格當中,並且使方格的每一行和每一列中都包含1 9這九個數字。同時還要保證,空格中用粗線劃分成9個3x3的方格也同時包含1 9這九個數字。比如有這樣乙個題,大家可以仔細觀察一下,在這裡面每行 每列,以及每個3x3的方格都包含1 9...

C語言中的數獨問題(回溯)

描述 數獨遊戲規則 在9階方陣中,包含了81個小格 九列九行 其中又再分成九個小正方形 稱為宮 每宮有九小格。遊戲剛開始時,盤面上有些小格已經填了數字 稱為初盤 遊戲者要在空白的小格中填入1到9的數字,使得最後每行 每列 每宮都不出現重複的數字,而且每乙個遊戲都只有乙個唯一的解答 稱為終盤 輸入 乙...

回溯演算法python 數獨問題 回溯演算法經典例題

之前我們已經簡單地說明了怎樣用回溯演算法解決數獨的問題,思路如下 從第乙個空格開始。依次嘗試 1 到 9 的數字,如果數字與盤面衝突就換成下乙個數字,如果不衝突就去往第二個空格 在第二個空格,同樣依次嘗試 1 到 9 的數字,如果與盤面衝突就換成下乙個數字,如果不衝突就去往第三個空格,以此類推 當最...