Valid Sudoku

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.

 1 public class Solution {
 2     public boolean isValidSudoku(char[][] board) {
 3         // Note: The Solution object is instantiated only once and is reused by each test case.
 4         if(board == null || board.length != 9 || board[0].length != 9) return false;
 5         int[] checkr = new int[9];
 6         int[] checkc = new int[9];
 7         for(int i = 0; i < 9; i ++){
 8             for(int j = 0; j < 9; j ++){
 9                 if(board[i][j] - '0' > 0 && board[i][j] - '0' < 10){
10                     checkr[board[i][j] - '0' - 1] ++;
11                 }
12                 if(board[j][i] - '0' > 0 && board[j][i] - '0' < 10){
13                     checkc[board[j][i] - '0' - 1] ++;
14                 }
15             }
16             for(int ii = 0; ii < 9; ii ++){
17                 if(checkr[ii] > 1 || checkc[ii] > 1){
18                     return false;
19                 }
20             }
21             checkr = new int[9];
22             checkc = new int[9];
23         }
24         for(int i = 0; i < 9; i ++){
25             for(int j = 0; j < 3; j ++){
26                 if(board[i][j] != '.')
27                     checkc[board[i][j] - '0' - 1] ++;
28             }
29             if((i + 1) % 3 == 0){
30                 for(int ii = 0; ii < 9; ii ++){
31                     if(checkr[ii] > 1 || checkc[ii] > 1){
32                         return false;
33                     }
34                 }
35                 checkc = new int[9];
36                 }
37             }
38         
39         checkc = new int[9];
40         for(int i = 0; i < 9; i ++){
41             for(int j = 3; j < 6; j ++){
42                 if(board[i][j] != '.')
43                     checkc[board[i][j] - '0' - 1] ++;
44             }
45             if((i + 1) % 3 == 0){
46                 for(int ii = 0; ii < 9; ii ++){
47                     if(checkr[ii] > 1 || checkc[ii] > 1){
48                         return false;
49                     }
50                 }
51                 checkc = new int[9];
52                 }
53             }
54         
55         checkc = new int[9];
56         for(int i = 0; i < 9; i ++){
57             for(int j = 6; j < 9; j ++){
58                 if(board[i][j] != '.')
59                     checkc[board[i][j] - '0' - 1] ++;
60             }
61             if((i + 1) % 3 == 0){
62                 for(int ii = 0; ii < 9; ii ++){
63                     if(checkr[ii] > 1 || checkc[ii] > 1){
64                         return false;
65                     }
66                 }
67                 checkc = new int[9];
68                 }
69             }
70         
71         return true;
72     }
73 }

 第二遍:

 1 public class Solution {
 2     public boolean isValidSudoku(char[][] board) {
 3         // Note: The Solution object is instantiated only once and is reused by each test case.
 4         if(board == null || board.length != 9 || board[0].length != 9) return false;
 5         boolean[] checkr = new boolean[9];
 6         boolean[] checkc = new boolean[9];
 7         for(int i = 0; i < 9; i ++){
 8             checkr = new boolean[9];
 9             checkc = new boolean[9];
10             for(int j = 0; j < 9; j ++){
11                 if ( board[i][j] != '.'){
12                     if(checkr[board[i][j] - '1']) return false;
13                     checkr[board[i][j] - '1'] = true;
14                 }
15                 if ( board[j][i] != '.'){
16                     if(checkc[board[j][i] - '1']) return false;
17                     checkc[board[j][i] - '1'] = true;
18                 }
19             }
20         }
21         for(int a = 0; a < 3; a ++){
22             for(int b = 0; b < 3; b ++){
23                 checkr = new boolean[9];
24                 for(int i = a * 3; i < (a + 1) * 3; i ++){
25                     for(int j = b * 3; j < (b + 1) *3; j ++){
26                         if ( board[i][j]!='.' ){
27                             if(checkr[board[i][j] - '1']) return false;
28                             checkr[board[i][j] - '1'] = true;
29                         }
30                     }
31                 }
32             }
33         }
34         return true;
35     }
36 }

 第三遍:

 1 public class Solution {
 2     public boolean isValidSudoku(char[][] board) {
 3         if(board == null || board.length != 9 || board[0].length != 9) return false;
 4         boolean[] value = new boolean[9];
 5         for(int i = 0; i < 9; i ++){
 6             value = new boolean[9];
 7             for(int j = 0; j < 9; j ++){
 8                 if(board[i][j] != '.' && value[board[i][j] - '1']) return false;
 9                 else if(board[i][j] != '.' && !value[board[i][j] - '1']) value[board[i][j] - '1'] = true;
10             }
11             value = new boolean[9];
12             for(int j = 0; j < 9; j ++){
13                 if(board[j][i] != '.' && value[board[j][i] - '1']) return false;
14                 else if(board[j][i] != '.' && !value[board[j][i] - '1']) value[board[j][i] - '1'] = true;
15             }
16         }
17         for(int k = 0; k < 3; k ++){
18             for(int h = 0; h < 3; h ++){
19                 value = new boolean[9];
20                 for(int i = 3*k; i < 3*k + 3; i ++){
21                     for(int j = 3*h; j < 3*h + 3; j ++){
22                         if(board[i][j] != '.' && value[board[i][j] - '1']) return false;
23                         else if(board[i][j] != '.' && !value[board[i][j] - '1']) value[board[i][j] - '1'] = true;
24                     }
25                 }
26             }
27         }
28         return true;
29     }
30 }
原文地址:https://www.cnblogs.com/reynold-lei/p/3366309.html