问题描述:
Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:
- Each row must contain the digits
1-9
without repetition. - Each column must contain the digits
1-9
without repetition. - Each of the 9
3x3
sub-boxes of the grid must contain the digits1-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.
解题思路:
最暴力的解法就是先判断横的,再判断竖的,最后判断小方块。
笔者将这三个步骤放到一个循环里面,这样可以简化代码。
首先定义三个变量use1[9][9] = {0}, use2[9][9] = {0}, use3[9][9] = {0}。use1[i][j]表示第i行是否有j元素。use2[i][j]表示第j列是否有i元素。use3[i][j]表示第i个小方块是否有j元素。
注意,这里有一个小技巧,将(i, j)映射到第k = i / 3 * 3 + j / 3个小方块上。
源码:
class Solution {
public:
const int boardSize = 9;
bool isValidSudoku(vector<vector<char>>& board) {
int use1[9][9] = {0}, use2[9][9] = {0}, use3[9][9] = {0};
for(int i=0; i<9; i++){
for(int j=0; j<9; j++){
if(board[i][j] != '.'){
int num = board[i][j] - '1';
int k = i / 3 * 3 + j / 3;
if(use1[i][num] || use2[num][j] || use3[k][num])
return false;
use1[i][num] = use2[num][j] = use3[k][num] = 1;
}
}
}
return true;
}
};