LeetCode(37): 每k個一組翻轉鏈表

Hard!html

題目描述:數組

編寫一個程序,經過已填充的空格來解決數獨問題。spa

一個數獨的解法需遵循以下規則:code

  1. 數字 1-9 在每一行只能出現一次。
  2. 數字 1-9 在每一列只能出現一次。
  3. 數字 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 };
相關文章
相關標籤/搜索