19.2.3 [LeetCode 36] Valid Sudoku

Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

  1. Each row must contain the digits 1-9 without repetition.
  2. Each column must contain the digits 1-9 without repetition.
  3. Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition.


A partially filled sudoku which is valid.

The Sudoku board could be partially filled, where empty cells are filled with the character '.'.

Example 1:

Input:
[
  ["5","3",".",".","7",".",".",".","."],
  ["6",".",".","1","9","5",".",".","."],
  [".","9","8",".",".",".",".","6","."],
  ["8",".",".",".","6",".",".",".","3"],
  ["4",".",".","8",".","3",".",".","1"],
  ["7",".",".",".","2",".",".",".","6"],
  [".","6",".",".",".",".","2","8","."],
  [".",".",".","4","1","9",".",".","5"],
  [".",".",".",".","8",".",".","7","9"]
]
Output: true

Example 2:

Input:
[
  ["8","3",".",".","7",".",".",".","."],
  ["6",".",".","1","9","5",".",".","."],
  [".","9","8",".",".",".",".","6","."],
  ["8",".",".",".","6",".",".",".","3"],
  ["4",".",".","8",".","3",".",".","1"],
  ["7",".",".",".","2",".",".",".","6"],
  [".","6",".",".",".",".","2","8","."],
  [".",".",".","4","1","9",".",".","5"],
  [".",".",".",".","8",".",".","7","9"]
]
Output: false
Explanation: Same as Example 1, except with the 5 in the top left corner being 
    modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.

Note:

  • A Sudoku board (partially filled) could be valid but is not necessarily solvable.
  • Only the filled cells need to be validated according to the mentioned rules.
  • The given board contain only digits 1-9 and the character '.'.
  • The given board size is always 9x9.
 1 class Solution {
 2 public:
 3     bool isValidSudoku(vector<vector<char>>& board) {
 4         for (int i = 0; i < 9; i++) {
 5             bool used[10] = { false };
 6             for (int j = 0; j < 9; j++) {
 7                 if (board[i][j] == '.')continue;
 8                 if (used[board[i][j]-'0'])
 9                     return false;
10                 used[board[i][j]-'0'] = true;
11             }
12         }
13         for (int i = 0; i < 9; i++) {
14             bool used[10] = { false };
15             for (int j = 0; j < 9; j++) {
16                 if (board[j][i] == '.')continue;
17                 if (used[board[j][i]-'0'])
18                     return false;
19                 used[board[j][i]-'0'] = true;
20             }
21         }
22         int limit[9][4] = { 0,2,0,2,
23                         3,5,0,2,
24                         6,8,0,2,
25                         0,2,3,5,
26                         3,5,3,5,
27                         6,8,3,5,
28                         0,2,6,8,
29                         3,5,6,8,
30                         6,8,6,8 };
31         for (int i = 0; i < 9; i++) {
32             bool used[10] = { false };
33             for(int j=limit[i][2];j<=limit[i][3];j++)
34                 for (int k = limit[i][0]; k <= limit[i][1]; k++) {
35                     if (board[j][k] == '.')continue;
36                     if (used[board[j][k]-'0'])
37                         return false;
38                     used[board[j][k]-'0'] = true;
39                 }
40         }
41         return true;
42     }
43 };
View Code

朴素解法

原文地址:https://www.cnblogs.com/yalphait/p/10350298.html