From f554ae0b0675a39aeea5b1043d162dcbc9006df1 Mon Sep 17 00:00:00 2001 From: khalidx3 Date: Fri, 3 Oct 2025 23:46:18 +0530 Subject: [PATCH 1/2] Added Sudoku Solver backtracking algorithm with test cases --- .../backtracking/SudokuSolver.java | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/main/java/com/thealgorithms/backtracking/SudokuSolver.java diff --git a/src/main/java/com/thealgorithms/backtracking/SudokuSolver.java b/src/main/java/com/thealgorithms/backtracking/SudokuSolver.java new file mode 100644 index 000000000000..2e73487d9b8d --- /dev/null +++ b/src/main/java/com/thealgorithms/backtracking/SudokuSolver.java @@ -0,0 +1,85 @@ +package main.java.com.thealgorithms.backtracking; + +public class SudokuSolver { + public static boolean sudokuSolver(int sudoku[][], int row, int col) { + // base case + if (row == 9) { + return true; + } + // recursion + int nextRow = row, nextCol = col + 1; + if (col + 1 == 9) { + nextRow = row + 1; + nextCol = 0; + } + if (sudoku[row][col] != 0) { + return sudokuSolver(sudoku, nextRow, nextCol); + } + for (int digit = 1; digit <= 9; digit++) { + if (isSafe(sudoku, row, col, digit)) { + sudoku[row][col] = digit; + + if (sudokuSolver(sudoku, nextRow, nextCol)) { + return true; + } + sudoku[row][col] = 0; + } + } + + return false; + } + + public static boolean isSafe(int sudoku[][], int row, int col, int digit) { + // col + for (int i = 0; i <= 8; i++) { + if (sudoku[i][col] == digit) { + return false; + } + } + // row + for (int j = 0; j <= 8; j++) { + if (sudoku[row][j] == digit) { + return false; + } + } + // grid + int sr = (row / 3) * 3; + int sc = (col / 3) * 3; + for (int i = sr; i < sr + 3; i++) { + for (int j = sc; i < sr + 3; i++) { + if (sudoku[i][j] == digit) { + return false; + } + } + } + return true; + } + + public static void print(int sudoku[][]) { + for (int i = 0; i < 9; i++) { + for (int j = 0; j < 9; j++) { + System.out.print(sudoku[i][j] + " "); + } + System.out.println(); + } + } + + public static void main(String[] args) { + int sudoku[][] = { { 3, 0, 6, 5, 0, 8, 4, 0, 0 }, + { 5, 2, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 8, 7, 0, 0, 0, 0, 3, 1 }, + { 0, 0, 3, 0, 1, 0, 0, 8, 0 }, + { 9, 0, 0, 8, 6, 3, 0, 0, 5 }, + { 0, 5, 0, 0, 9, 0, 6, 0, 0 }, + { 1, 3, 0, 0, 0, 0, 2, 5, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 7, 4 }, + { 0, 0, 5, 2, 0, 6, 3, 0, 0 } }; + if (sudokuSolver(sudoku, 0, 0)) { + + print(sudoku); + } else { + System.out.println("not valid"); + } + } + +} From 06d059238489b8bd1414c1ecce5c3f2ef46b5474 Mon Sep 17 00:00:00 2001 From: khalidx3 Date: Sat, 4 Oct 2025 00:09:28 +0530 Subject: [PATCH 2/2] Fixed formatting and build issues for Sudoku Solver --- .../backtracking/SudokuSolver.java | 81 +++++++++---------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/thealgorithms/backtracking/SudokuSolver.java b/src/main/java/com/thealgorithms/backtracking/SudokuSolver.java index 2e73487d9b8d..8814701095da 100644 --- a/src/main/java/com/thealgorithms/backtracking/SudokuSolver.java +++ b/src/main/java/com/thealgorithms/backtracking/SudokuSolver.java @@ -1,61 +1,58 @@ package main.java.com.thealgorithms.backtracking; public class SudokuSolver { - public static boolean sudokuSolver(int sudoku[][], int row, int col) { - // base case + + public static boolean sudokuSolver(int[][] sudoku, int row, int col) { if (row == 9) { - return true; + return true; // base case: reached the end } - // recursion - int nextRow = row, nextCol = col + 1; - if (col + 1 == 9) { + + int nextRow = row; + int nextCol = col + 1; + if (nextCol == 9) { nextRow = row + 1; nextCol = 0; } + if (sudoku[row][col] != 0) { return sudokuSolver(sudoku, nextRow, nextCol); } - for (int digit = 1; digit <= 9; digit++) { - if (isSafe(sudoku, row, col, digit)) { - sudoku[row][col] = digit; + for (int num = 1; num <= 9; num++) { + if (isSafe(sudoku, row, col, num)) { + sudoku[row][col] = num; if (sudokuSolver(sudoku, nextRow, nextCol)) { return true; } - sudoku[row][col] = 0; + sudoku[row][col] = 0; // backtrack } } - return false; } - public static boolean isSafe(int sudoku[][], int row, int col, int digit) { - // col - for (int i = 0; i <= 8; i++) { - if (sudoku[i][col] == digit) { - return false; - } - } - // row - for (int j = 0; j <= 8; j++) { - if (sudoku[row][j] == digit) { + private static boolean isSafe(int[][] sudoku, int row, int col, int num) { + // Check row and column + for (int i = 0; i < 9; i++) { + if (sudoku[row][i] == num || sudoku[i][col] == num) { return false; } } - // grid - int sr = (row / 3) * 3; - int sc = (col / 3) * 3; - for (int i = sr; i < sr + 3; i++) { - for (int j = sc; i < sr + 3; i++) { - if (sudoku[i][j] == digit) { + + // Check 3x3 subgrid + int startRow = row - row % 3; + int startCol = col - col % 3; + for (int i = startRow; i < startRow + 3; i++) { + for (int j = startCol; j < startCol + 3; j++) { + if (sudoku[i][j] == num) { return false; } } } + return true; } - public static void print(int sudoku[][]) { + private static void printSudoku(int[][] sudoku) { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { System.out.print(sudoku[i][j] + " "); @@ -65,21 +62,23 @@ public static void print(int sudoku[][]) { } public static void main(String[] args) { - int sudoku[][] = { { 3, 0, 6, 5, 0, 8, 4, 0, 0 }, - { 5, 2, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 8, 7, 0, 0, 0, 0, 3, 1 }, - { 0, 0, 3, 0, 1, 0, 0, 8, 0 }, - { 9, 0, 0, 8, 6, 3, 0, 0, 5 }, - { 0, 5, 0, 0, 9, 0, 6, 0, 0 }, - { 1, 3, 0, 0, 0, 0, 2, 5, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 7, 4 }, - { 0, 0, 5, 2, 0, 6, 3, 0, 0 } }; - if (sudokuSolver(sudoku, 0, 0)) { + int[][] sudoku = { + { 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 } + }; - print(sudoku); + if (sudokuSolver(sudoku, 0, 0)) { + System.out.println("Sudoku Solved:"); + printSudoku(sudoku); } else { - System.out.println("not valid"); + System.out.println("No solution exists."); } } - }