標籤:數獨 矩陣 演算法 面試 java
【036-Valid Sudoku(驗證數獨棋盤)】
【LeetCode-面試演算法經典-Java實現】【所有題目目錄索引】
原題
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
The Sudoku board could be partially filled, where empty cells are filled with the character ‘.‘
.
A partially filled sudoku which is valid.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
題目大意
驗證一個數獨棋盤是否合法,數獨棋盤的驗證規則見連結對應的頁面。
數獨棋盤是部分填滿的,空的位置使用點來代替。
注意:合法的棋盤不一定要求的可解的,只要填充的數字滿足要求就可以。
解題思路
先對行進行檢查,再對列進行檢查,最後檢查3*3的方格。
代碼實現
演算法實作類別
public class Solution { public boolean isValidSudoku(char[][] board) { // .的ASCII值是46,0的ASCII值是48,/的ASCII值是47 int number = board[0].length; int[] record = new int[10 + 2]; //儲存.到9的值,儲存資料的位置在[2, 10] boolean isValid; reset(record); // 對行進行檢查 for (int i = 0; i < number; i++) { for (int j = 0; j < number; j++) { record[board[i][j] - ‘.‘]++; } if (!check(record)) { // 如是檢查失敗 return false; } else { // 檢查成功重設棋盤 reset(record); } } // 對列進行檢查 for (int i = 0; i < number; i++) { for (int j = 0; j < number; j++) { record[board[j][i] - ‘.‘]++; } if (!check(record)) { // 如是檢查失敗 return false; } else { // 檢查成功重設棋盤 reset(record); } } // 檢查3*3方塊 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { for (int k = i * 3; k < (i + 1) * 3; k++) { for (int l = j * 3; l < (j + 1) * 3; l++) { record[board[k][l]- ‘.‘]++; } } if (!check(record)) { // 如是檢查失敗 return false; } else { // 檢查成功重設棋盤 reset(record); } } } return true; } private void reset(int[] a) { for (int i = 0; i < a.length; i++) { a[i] = 0; } } /** * 檢查棋盤一行,一列,或者3*3的方格是否合法,如果1-9中的數字個數大於1就不合法 * * @param a 驗證數字 * @return 返回結果 */ private boolean check(int[] a) { for (int i = 2; i < a.length; i++) { if (a[i] > 1) { return false; } } return true; }}
評測結果
點擊圖片,滑鼠不釋放,拖動一段位置,釋放後在新的視窗中查看完整圖片。
特別說明
歡迎轉載,轉載請註明出處【http://blog.csdn.net/derrantcm/article/details/47079373】
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
【LeetCode-面試演算法經典-Java實現】【036-Valid Sudoku(驗證數獨棋盤)】