Sudoku Solver Using Backtracking in DSA C++ - Build from Scratch
Create a 9x9 2D vector of integers called board with the exact values below, where 0 represents empty cells:
{
{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}
}Use std::vector to create a 2D vector named board with the exact Sudoku puzzle values.
Create a function called isSafe that takes three parameters: row, col, and num. It should return true if placing num in board[row][col] does not break Sudoku rules (no duplicates in the same row, column, or 3x3 box), otherwise false.
Check the row, column, and 3x3 box for the number num. Return false if found, otherwise true.
Create a function called solveSudoku that returns true if the Sudoku puzzle is solved, otherwise false. Use nested loops to find an empty cell (value 0). For each empty cell, try numbers 1 to 9. Use isSafe to check if the number can be placed. If yes, place the number and recursively call solveSudoku. If recursion returns true, return true. Otherwise, reset the cell to 0 and try the next number. If no number fits, return false.
Use nested loops to find empty cells and try numbers 1 to 9. Use recursion to solve the puzzle step-by-step.
Call solveSudoku() to solve the puzzle. Then print the board row by row, with spaces between numbers. Each row should be printed on a new line.
Call solveSudoku() and then print each row of board with spaces between numbers.
Practice
backtracking technique used in a Sudoku solver?Solution
Step 1: Understand backtracking in Sudoku
Backtracking tries numbers in empty cells and checks if they fit the Sudoku rules.Step 2: Undo if conflict arises
If a number causes a conflict later, it is removed (backtracked) and another number is tried.Final Answer:
Try placing numbers and undo if they lead to conflicts -> Option CQuick Check:
Backtracking = Try and undo [OK]
- Thinking backtracking fills randomly
- Assuming backtracking fills only once without undo
- Believing backtracking uses fixed patterns
Solution
Step 1: Understand the safety check function
The functionisSafechecks if placingnumatboard[row][col]follows Sudoku rules.Step 2: Place number only if safe
Only ifisSafereturns true, the number is placed in the cell.Final Answer:
if (isSafe(board, row, col, num)) { board[row][col] = num; } -> Option AQuick Check:
Use isSafe before placing number [OK]
- Placing number without checking rules
- Checking if cell already has the number incorrectly
- Using invalid conditions for placement
int board[9][9] = {
{5,3,0,0,7,0,0,0,0},
{6,0,0,1,9,5,0,0,0},
{0,9,8,0,0,0,0,6,0},
{8,0,0,0,6,0,0,0,3},
{4,0,0,8,0,3,0,0,1},
{7,0,0,0,2,0,0,0,6},
{0,6,0,0,0,0,2,8,0},
{0,0,0,4,1,9,0,0,5},
{0,0,0,0,8,0,0,7,9}
};
solveSudoku(board);
Assuming solveSudoku correctly solves the puzzle, what will be the value at board[0][2] after solving?Solution
Step 1: Identify the empty cell at (0,2)
The cell at row 0, column 2 is initially 0 (empty).Step 2: Solve Sudoku and find correct number
After solving, the number 4 fits at (0,2) without conflicts in row, column, or box.Final Answer:
4 -> Option BQuick Check:
board[0][2] = 4 after solve [OK]
- Guessing without checking Sudoku rules
- Confusing row and column indices
- Assuming initial zeros remain zeros
bool isSafe(int board[9][9], int row, int col, int num) {
for (int x = 0; x < 9; x++) {
if (board[row][x] == num || board[x][col] == num)
return false;
}
int startRow = row - row % 3;
int startCol = col - col % 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[i][j] == num)
return false;
}
}
return true;
}
What is the bug in this code?Solution
Step 1: Analyze 3x3 box checking loop
The inner loop checksboard[i][j]instead ofboard[startRow + i][startCol + j], so it checks wrong cells.Step 2: Correct indices for box check
To check the correct 3x3 box, addstartRowandstartColoffsets toiandj.Final Answer:
The 3x3 box check uses wrong indices; should use startRow + i and startCol + j -> Option AQuick Check:
Box check indices must include startRow/startCol [OK]
- Checking wrong cells in 3x3 box
- Ignoring row or column checks
- Incorrect modulo usage
Solution
Step 1: Understand heuristic to reduce search space
Choosing the cell with the fewest valid options first reduces branching and speeds up solving.Step 2: Compare other strategies
Filling first empty cell or random tries increase backtracking steps; ignoring constraints causes errors.Final Answer:
Choose the empty cell with the fewest possible valid numbers first -> Option DQuick Check:
Minimum remaining values heuristic = choose cell with fewest options [OK]
- Filling cells without checking possibilities
- Trying numbers randomly wastes time
- Ignoring constraints leads to wrong solutions
Ready to prove it?
Pass the test and this pattern moves unknown
