Leetcode36--->Valid Sudoku(判斷給定的數獨是否有效)


題目:給定一個數獨,某些部分已經被填上了數字,其余空的地方用‘.’表示;判斷給定的數獨是否有效;

數獨規則: 每一行不能有重復的數字;每一列不能有重復的數字;將數獨框划分為三行三列,沒9個小方格不能有重復;

解題思路:

該題目不要判斷整個數獨是否有解,只需要判斷當前給出的數獨是否有效。因此只需要判斷行和列是否有效,判斷每個塊是否有效。而判斷一行中是否有重復的數字,最好的數據結構莫過於Set結構了。

使用rowSet,colSet兩個Set結構來分別保存當前遍歷的行和列,(i, j)表示行,則(j, i)就表示列。因此可以在判斷第一行是否有效的同時,順便判斷第一列是否有效;塊單獨做檢查;

代碼如下:

 1 public class Solution {
 2     public boolean isValidSudoku(char[][] board) {
 3         if(board == null || board.length < 9 || board[0].length < 9)
 4             return false;
 5         Set<Character> rowset = new HashSet<Character>();
 6         Set<Character> colset = new HashSet<Character>();
 7        
 8         for(int i = 0; i < 9; i++)
 9         {
10             rowset.clear();
11             colset.clear();
12             for(int j = 0; j < 9; j ++)
13             {
14                 if(i % 3 == 0 && j % 3 == 0)  // 檢查塊是否有效
15                 {
16                     if(!checkBlock(board, i, j))
17                         return false;
18                 }
19                 if(board[i][j] != '.')  // 檢查行是否有效
20                 {
21                     if(rowset.contains(board[i][j]))
22                         return false;
23                     rowset.add(board[i][j]);
24                 }
25                 if(board[j][i] != '.')  // 檢查列是否有效
26                 {
27                     if(colset.contains(board[j][i]))
28                         return false;
29                     colset.add(board[j][i]);
30                 }
31             }
32         }
33         return true;
34         
35     }
36     public boolean checkBlock(char[][] board, int row, int col)  // 檢查塊是否有效
37     {
38         Set<Character> blockSet = new HashSet<Character>();
39         for(int i = row; i < row + 3; i++)
40         {
41             for(int j = col; j < col + 3; j++)
42             {
43                 if(board[i][j] != '.')
44                 {
45                     if(blockSet.contains(board[i][j]))
46                         return false;
47                     blockSet.add(board[i][j]);
48                 }
49             }
50         }
51         return true;
52     }
53 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM