fn is_valid(board: &[[u8; 9]; 9], row: usize, col: usize, num: u8) -> bool {
for x in 0..9 {
if board[row][x] == num || board[x][col] == num {
return false; // number conflicts in row or column
}
}
let box_row_start = (row / 3) * 3;
let box_col_start = (col / 3) * 3;
for r in box_row_start..box_row_start + 3 {
for c in box_col_start..box_col_start + 3 {
if board[r][c] == num {
return false; // number conflicts in 3x3 box
}
}
}
true // no conflicts found
}
fn solve_sudoku(board: &mut [[u8; 9]; 9]) -> bool {
for row in 0..9 {
for col in 0..9 {
if board[row][col] == 0 {
for num in 1..=9 {
if is_valid(board, row, col, num) {
board[row][col] = num; // place number
if solve_sudoku(board) {
return true; // solved
}
board[row][col] = 0; // backtrack
}
}
return false; // no valid number found, trigger backtrack
}
}
}
true // all cells filled correctly
}
fn print_board(board: &[[u8; 9]; 9]) {
for (i, row) in board.iter().enumerate() {
if i % 3 == 0 && i != 0 {
println!("------+-------+------");
}
for (j, &val) in row.iter().enumerate() {
if j % 3 == 0 && j != 0 {
print!("| ");
}
if val == 0 {
print!("_ ");
} else {
print!("{} ", val);
}
}
println!();
}
}
fn main() {
let mut board = [
[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],
];
println!("Initial Sudoku board:");
print_board(&board);
if solve_sudoku(&mut board) {
println!("\nSolved Sudoku board:");
print_board(&board);
} else {
println!("No solution exists");
}
}