From 4797abb8b2cf72858ad7c5369a2a8c76da3db48c Mon Sep 17 00:00:00 2001 From: Aadit Agrawal Date: Tue, 29 Oct 2024 11:26:12 +0530 Subject: [PATCH] Add DS/C/test/sudoku.c --- DS/C/test/sudoku.c | 101 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 DS/C/test/sudoku.c diff --git a/DS/C/test/sudoku.c b/DS/C/test/sudoku.c new file mode 100644 index 0000000..b44cda2 --- /dev/null +++ b/DS/C/test/sudoku.c @@ -0,0 +1,101 @@ +#include +#include + +#define N 9 + +// printf function +void printBoard(int board[N][N]) { + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + printf("%d ", board[i][j]); + } + printf("\n"); + } +} + +// if placing num at board[row][col] is valid +bool isValid(int board[N][N], int row, int col, int num) { + // Check row + for (int x = 0; x < N; x++) + if (board[row][x] == num) + return false; + + // Check column + for (int x = 0; x < N; x++) + if (board[x][col] == num) + return false; + + // Check grid + 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 + startRow][j + startCol] == num) + return false; + + return true; +} + +// solve Sudoku using backtracking +bool solveSudoku(int board[N][N]) { + int row, col; + bool emptyFound = false; + + // Find the next empty cell + for (row = 0; row < N; row++) { + for (col = 0; col < N; col++) { + if (board[row][col] == 0) { + emptyFound = true; + break; + } + } + if (emptyFound) + break; + } + + // No empty cell left, puzzle solved + if (!emptyFound) + return true; + + // Try placing digits 1-9 + for (int num = 1; num <= N; num++) { + if (isValid(board, row, col, num)) { + board[row][col] = num; + + if (solveSudoku(board)) + return true; + + // Undo if not valid + board[row][col] = 0; + } + } + + return false; // No sol found +} + +int main() { + int board[N][N]; + + // enter the board values + printf("Enter the Sudoku board values (use 0 for empty cells):\n"); + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + printf("Enter value for cell [%d][%d]: ", i + 1, j + 1); + scanf("%d", &board[i][j]); + // error handling included + if (board[i][j] < 0 || board[i][j] > 9) { + printf("Invalid input. Please enter a number between 0 and 9.\n"); + j--; // Retry current cell + } + } + } + + if (solveSudoku(board)) { + printf("\nSolved Sudoku:\n"); + printBoard(board); + } else { + printf("No solution exists\n"); + } + + return 0; +}