Hard!html
題目描述:數組
編寫一個程序,經過已填充的空格來解決數獨問題。spa
一個數獨的解法需遵循以下規則:code
1-9
在每一行只能出現一次。1-9
在每一列只能出現一次。1-9
在每個以粗實線分隔的 3x3
宮內只能出現一次。空白格用 '.'
表示。htm
一個數獨。blog
答案被標成紅色。遞歸
Note:get
1-9
和字符 '.'
。9x9
形式的。解題思路:io
這道求解數獨的題是在以前那道 Valid Sudoku 驗證數獨的基礎上的延伸,以前那道題讓咱們驗證給定的數組是否爲數獨數組,這道讓咱們求解數獨數組。class
對於每一個須要填數字的格子帶入1到9,每代入一個數字都斷定其是否合法,若是合法就繼續下一次遞歸。
結束時把數字設回'.',判斷新加入的數字是否合法時,只須要斷定當前數字是否合法,不須要斷定這個數組是否爲數獨數組,由於以前加進的數字都是合法的,這樣能夠使程序更加高效一些。
C++解法一:
1 class Solution { 2 public: 3 void solveSudoku(vector<vector<char> > &board) { 4 if (board.empty() || board.size() != 9 || board[0].size() != 9) return; 5 solveSudokuDFS(board, 0, 0); 6 } 7 bool solveSudokuDFS(vector<vector<char> > &board, int i, int j) { 8 if (i == 9) return true; 9 if (j >= 9) return solveSudokuDFS(board, i + 1, 0); 10 if (board[i][j] == '.') { 11 for (int k = 1; k <= 9; ++k) { 12 board[i][j] = (char)(k + '0'); 13 if (isValid(board, i , j)) { 14 if (solveSudokuDFS(board, i, j + 1)) return true; 15 } 16 board[i][j] = '.'; 17 } 18 } else { 19 return solveSudokuDFS(board, i, j + 1); 20 } 21 return false; 22 } 23 bool isValid(vector<vector<char> > &board, int i, int j) { 24 for (int col = 0; col < 9; ++col) { 25 if (col != j && board[i][j] == board[i][col]) return false; 26 } 27 for (int row = 0; row < 9; ++row) { 28 if (row != i && board[i][j] == board[row][j]) return false; 29 } 30 for (int row = i / 3 * 3; row < i / 3 * 3 + 3; ++row) { 31 for (int col = j / 3 * 3; col < j / 3 * 3 + 3; ++col) { 32 if ((row != i || col != j) && board[i][j] == board[row][col]) return false; 33 } 34 } 35 return true; 36 } 37 };