From 04c16a2838a3ba15953d4423203baa90c8f682b0 Mon Sep 17 00:00:00 2001 From: tushar-2301 Date: Fri, 19 Dec 2025 15:43:18 +0530 Subject: [PATCH] Enhanced sudoku.c Added a new feature in the sudoku solver which detects if the given sudoku itself is correct or not, and also in this version, it also shows you in real time how the computer is solving the sudoku. --- 7 Sudoku Solver/sudoku.c | 237 ++++++++++++++++++++++++++------------- 1 file changed, 158 insertions(+), 79 deletions(-) diff --git a/7 Sudoku Solver/sudoku.c b/7 Sudoku Solver/sudoku.c index 6eb2922..95ac17d 100644 --- a/7 Sudoku Solver/sudoku.c +++ b/7 Sudoku Solver/sudoku.c @@ -1,6 +1,16 @@ +#define _POSIX_C_SOURCE 199309L +#include #include +#include -int puzzle[9][9] = { + +void print_puzzle(int puzzle[9][9]); +int valid_move(int puzzle[9][9], int x, int y, int val); +int solve_puzzle(int puzzle[9][9], int x, int y); +int valid_puzzle(int puzzle[9][9]); +void clear_screen(); + +int sudoku[9][9] = { {3,0,0,0,2,0,0,7,0}, {9,0,0,5,0,0,0,1,4}, {0,1,6,3,7,0,0,0,8}, @@ -12,97 +22,166 @@ int puzzle[9][9] = { {7,3,1,0,8,2,0,0,0}, }; -void print_puzzle(int puzzle[9][9]); -int valid_move(int puzzle[9][9], int row, int col, int val); -int solve_puzzle(int puzzle[9][9], int row, int col); - -int main() { - printf("\n\tWelcome to SUDOKU Solver !!!"); - printf("\n\nOriginal Puzzle:"); - print_puzzle(puzzle); - if (solve_puzzle(puzzle, 0, 0)) { - printf("\n The puzzle is solved: "); - print_puzzle(puzzle); - } else { - printf("\n This puzzle is not Solvable\n"); - } - return 0; -} +struct timespec ts; -int solve_puzzle(int puzzle[9][9], int row, int col) { +int main(void) +{ + ts.tv_sec = 0; + ts.tv_nsec = 50000000; - if (col == 9) { - if (row == 8) { - return 1; // Puzzle solved + printf("Original Puzzle : \n"); + print_puzzle(sudoku); + if (valid_puzzle(sudoku)) + { + if (solve_puzzle(sudoku, 0, 0)) + { + printf("The solved puzzle is : \n"); + print_puzzle(sudoku); + } + else + { + printf("OOPS..The puzzle is not solvable :(\n"); + } } - row++; - col = 0; - } - - if (puzzle[row][col] > 0) { - return solve_puzzle(puzzle, row, col + 1); - } - - for (int i = 1; i <= 9; i++) { - if (valid_move(puzzle, row, col, i)) { - puzzle[row][col] = i; - if (solve_puzzle(puzzle, row, col + 1)) { - return 1; - } - puzzle[row][col] = 0; + else + { + printf("\nSorry, the given puzzle itself is wrong :)\n"); } - } - return 0; + + return 0; } -int valid_move(int puzzle[9][9], int row, int col, int val) { - // valid row - for (int i = 0; i < 9; i++) { - if (puzzle[row][i] == val) { - return 0; +int solve_puzzle(int puzzle[9][9], int x, int y) +{ + nanosleep(&ts, NULL); + clear_screen(); + print_puzzle(puzzle); + if (x == 9) + { + if (y == 8) + { + return 1; + } + y = y + 1; + x = 0; + } + + if (puzzle[y][x] > 0) + { + return solve_puzzle(puzzle, x + 1, y); } - } - // valid column - for (int i = 0; i < 9; i++) { - if (puzzle[i][col] == val) { - return 0; + for (int i = 1; i <= 9; i++) + { + if (valid_move(sudoku, x, y, i)) + { + sudoku[y][x] = i; + if (solve_puzzle(sudoku, x + 1, y)) + { + return 1; + } + sudoku[y][x] = 0; + } } - } - - // valid square - int r = row - row % 3; - int c = col - col % 3; - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - if (puzzle[r+i][c+j] == val) { - return 0; - } + return 0; +} + + +int valid_move(int puzzle[9][9], int x, int y, int val) +{ + for (int i = 0; i < 9; i++) + { + if (puzzle[y][i] == val) + { + return 0; + } + + if (puzzle[i][x] == val) + { + return 0; + } } - } - return 1; + int c = x - x % 3; + int r = y - y % 3; + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 3; j++) + { + if (puzzle[r + i][c + j] == val) + { + return 0; + } + } + } + return 1; } -void print_puzzle(int puzzle[9][9]) { - printf("\n+-------+-------+-------+"); - for (int row = 0; row < 9; row++) { - if (row % 3 == 0 && row != 0) { - printf("\n|-------+-------+-------|"); + +int valid_puzzle(int puzzle[9][9]) +{ + for (int i =0; i<9; i++) + { + for (int j = 0; j<9; j++) + { + if (puzzle[i][j]==0) + { + continue; + } + else + { + int temp = puzzle[i][j]; + puzzle[i][j] = 0; + + if (valid_move(puzzle, j, i, temp) == 0) + { + return 0; + } + + puzzle[i][j] = temp; + } + } } - printf("\n"); - for (int col = 0; col < 9; col++) { - if (col % 3 == 0) { - printf("| "); - } - if (puzzle[row][col] != 0) { - printf("%d ", puzzle[row][col]); - } else { - printf(" "); - } + return 1; +} + + +void print_puzzle(int puzzle[9][9]) +{ + printf("\n+-------+-------+-------+\n"); + for (int i = 0; i < 9; i++) + { + if (i == 3 || i == 6) + { + printf("|-------+-------+-------|\n"); + } + for (int j = 0; j < 9; j++) + { + if (j % 3 == 0) + { + printf("| "); + } + if (puzzle[i][j] != 0) + { + printf("%d ", puzzle[i][j]); + } + else + { + printf(" "); + } + } + printf("|"); + printf("\n"); } - printf("|"); - } - printf("\n+-------+-------+-------+\n"); -} \ No newline at end of file + printf("+-------+-------+-------+\n"); +} + +void clear_screen() +{ + #ifdef _WIN32 + system("cls"); + #else + system("clear"); + #endif +}