# Check if given Sudoku board configuration is valid or not

Given a Sudoku Board configuration, check whether it is valid or not.

Examples:

```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

```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

The basic idea is to check whether each row, column, and the 3×3 box is valid or not on the basis of following points:

• The Sudoku board could be partially filled, where empty cells are filled with the character ‘.’.
• An empty Sudoku board is also valid.
• A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

Below is the implementation of above approach:

## C++

 `// Program to check whether given sudoku  ` `// board is valid or not ` `#include ` `using` `namespace` `std; ` ` `  `// Checks whether there is any duplicate  ` `// in current row or not ` `bool` `notInRow(``char` `arr[], ``int` `row) ` `{ ` `    ``// Set to store characters seen so far. ` `    ``set<``char``> st; ` ` `  `    ``for` `(``int` `i = 0; i < 9; i++) { ` ` `  `        ``// If already encountered before, return false ` `        ``if` `(st.find(arr[row][i]) != st.end()) ` `            ``return` `false``; ` ` `  `        ``// If it is not an empty cell, insert value ` `        ``// at the current cell in the set ` `        ``if` `(arr[row][i] != ``'.'``) ` `            ``st.insert(arr[row][i]); ` `    ``} ` `    ``return` `true``; ` `} ` ` `  `// Checks whether there is any duplicate ` `// in current column or not. ` `bool` `notInCol(``char` `arr[], ``int` `col) ` `{ ` `    ``set<``char``> st; ` ` `  `    ``for` `(``int` `i = 0; i < 9; i++) { ` ` `  `        ``// If already encountered before, return false ` `        ``if` `(st.find(arr[i][col]) != st.end()) ` `            ``return` `false``; ` ` `  `        ``// If it is not an empty cell, ` `        ``// insert value at the current cell in the set ` `        ``if` `(arr[i][col] != ``'.'``) ` `            ``st.insert(arr[i][col]); ` `    ``} ` `    ``return` `true``; ` `} ` ` `  `// Checks whether there is any duplicate ` `// in current 3x3 box or not. ` `bool` `notInBox(``char` `arr[], ``int` `startRow, ``int` `startCol) ` `{ ` `    ``set<``char``> st; ` ` `  `    ``for` `(``int` `row = 0; row < 3; row++) { ` `        ``for` `(``int` `col = 0; col < 3; col++) { ` `            ``char` `curr = arr[row + startRow][col + startCol]; ` ` `  `            ``// If already encountered before, return false ` `            ``if` `(st.find(curr) != st.end()) ` `                ``return` `false``; ` ` `  `            ``// If it is not an empty cell, ` `            ``// insert value at current cell in set ` `            ``if` `(curr != ``'.'``) ` `                ``st.insert(curr); ` `        ``} ` `    ``} ` `    ``return` `true``; ` `} ` ` `  `// Checks whether current row and current column and ` `// current 3x3 box is valid or not ` `bool` `isValid(``char` `arr[], ``int` `row, ``int` `col) ` `{ ` `    ``return` `notInRow(arr, row) && notInCol(arr, col) && ` `           ``notInBox(arr, row - row % 3, col - col % 3); ` `} ` ` `  `bool` `isValidConfig(``char` `arr[], ``int` `n) ` `{ ` `    ``for` `(``int` `i = 0; i < n; i++) { ` `        ``for` `(``int` `j = 0; j < n; j++) { ` ` `  `            ``// If current row or current column or ` `            ``// current 3x3 box is not valid, return false ` `            ``if` `(!isValid(arr, i, j)) ` `                ``return` `false``; ` `        ``} ` `    ``} ` `    ``return` `true``; ` `} ` ` `  `// Drivers code ` `int` `main() ` `{ ` `    ``char` `board = { { ``'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'` `} }; ` ` `  `    ``cout << (isValidConfig(board, 9) ? ``"YES\n"` `: ``"NO\n"``); ` `    ``return` `0; ` `} `

## Python3

# Python3 program to check whether
# given sudoku board is valid or not

# Checks whether there is any
# duplicate in current row or not
def notInRow(arr, row):

# Set to store characters seen so far.
st = set()

for i in range(0, 9):

# return false
if arr[row][i] in st:
return False

# If it is not an empty cell, insert value
# at the current cell in the set
if arr[row][i] != ‘.’:

return True

# Checks whether there is any
# duplicate in current column or not.
def notInCol(arr, col):

st = set()

for i in range(0, 9):

# return false
if arr[i][col] in st:
return False

# If it is not an empty cell, insert
# value at the current cell in the set
if arr[i][col] != ‘.’:

return True

# Checks whether there is any duplicate
# in current 3×3 box or not.
def notInBox(arr, startRow, startCol):

st = set()

for row in range(0, 3):
for col in range(0, 3):
curr = arr[row + startRow][col + startCol]

# return false
if curr in st:
return False

# If it is not an empty cell,
# insert value at current cell in set
if curr != ‘.’:

return True

# Checks whether current row and current
# column and current 3×3 box is valid or not
def isValid(arr, row, col):

return (notInRow(arr, row) and notInCol(arr, col) and
notInBox(arr, row – row % 3, col – col % 3))

def isValidConfig(arr, n):

for i in range(0, n):
for j in range(0, n):

# If current row or current column or
# current 3×3 box is not valid, return false
if not isValid(arr, i, j):
return False

return True

# Drivers code
if __name__ == “__main__”:

board = [[ ‘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’ ]]

if isValidConfig(board, 9):
print(“YES”)
else:
print(“NO”)

# This code is contributed by Rituraj Jain

Output:

```YES
```

My Personal Notes arrow_drop_up A Coding Enthusiast Rails Developer

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Improved By : rituraj_jain

Article Tags :
Practice Tags :

1

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.