# 【LeetCode】 36. Valid Sudoku
## Description
> 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 digits 1-9 without repetition.
> The Sudoku board could be partially filled, where empty cells are filled with the character '.'.
> 判斷一個9x9的數獨是否符合規則。有被填入數字的格子必須遵守以下規則:
> - 每一排都包含1-9的數字,且不能重複。
> - 每一列都包含1-9的數字,且不能重複。
> - 每一個3x3的小格子都都包含1-9的數字,且不能重複。
> 數獨板只有部分會被填入,空的格子會用字元'.'表示。
## Example:
```
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.
```
## Solution
* 單純照規則跑迴圈判斷即可,一開始可以寫成三段,分別去跑排、列、格。寫完之後會發現For Loop的部分可以合併,增加速度。
* 比較需要思考的是`3*3`的小格子要怎麼寫index。
### Code
```C++=1
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
for(int i=0;i<9;i++)
{
bool rows[9]={false};
bool cols[9]={false};
bool blocks[9]={false};
for(int j=0;j<9;j++)
{
if(board[i][j]!='.')
{
if(rows[board[i][j]-'1'])
return false;
rows[board[i][j]-'1']=true;
}
if(board[j][i]!='.')
{
if(cols[board[j][i]-'1'])
return false;
cols[board[j][i]-'1']=true;
}
if(board[((i/3)*3 + j/3)][((i%3)*3) + j%3]!='.')
{
if(blocks[board[((i/3)*3 + j/3)][((i%3)*3) + j%3]-'1'])
return false;
blocks[board[((i/3)*3 + j/3)][((i%3)*3) + j%3]-'1']=true;
}
}
}
return true;
}
};
```
###### tags: `LeetCode` `C++`