From f554ae0b0675a39aeea5b1043d162dcbc9006df1 Mon Sep 17 00:00:00 2001 From: khalidx3 Date: Fri, 3 Oct 2025 23:46:18 +0530 Subject: [PATCH 1/3] 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/3] 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."); } } - } From d56855e95a5f50974ad189a90af97a70bc8c572a Mon Sep 17 00:00:00 2001 From: khalidx3 Date: Sat, 4 Oct 2025 17:09:53 +0530 Subject: [PATCH 3/3] Format SudokuSolver.java using clang-format --- .../backtracking/SudokuSolver.java | 122 ++++++++---------- 1 file changed, 56 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/thealgorithms/backtracking/SudokuSolver.java b/src/main/java/com/thealgorithms/backtracking/SudokuSolver.java index 8814701095da..e460366168bb 100644 --- a/src/main/java/com/thealgorithms/backtracking/SudokuSolver.java +++ b/src/main/java/com/thealgorithms/backtracking/SudokuSolver.java @@ -2,83 +2,73 @@ public class SudokuSolver { - public static boolean sudokuSolver(int[][] sudoku, int row, int col) { - if (row == 9) { - return true; // base case: reached the end - } + public static boolean sudokuSolver(int[][] sudoku, int row, int col) { + if (row == 9) { + return true; // base case: reached the end + } - int nextRow = row; - int nextCol = col + 1; - if (nextCol == 9) { - nextRow = row + 1; - nextCol = 0; - } + 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); - } + if (sudoku[row][col] != 0) { + return sudokuSolver(sudoku, nextRow, nextCol); + } - 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; // backtrack - } + 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; // backtrack } - return false; - } + } + return false; + } - 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; - } + 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; } + } - // 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; - } - } + // 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; - } + return true; + } - 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] + " "); - } - System.out.println(); + 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] + " "); } - } + System.out.println(); + } + } - public static void main(String[] args) { - 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 } - }; + public static void main(String[] args) { + 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}}; - if (sudokuSolver(sudoku, 0, 0)) { - System.out.println("Sudoku Solved:"); - printSudoku(sudoku); - } else { - System.out.println("No solution exists."); - } - } + if (sudokuSolver(sudoku, 0, 0)) { + System.out.println("Sudoku Solved:"); + printSudoku(sudoku); + } else { + System.out.println("No solution exists."); + } + } }