Add DS/C/test/sudoku.c
This commit is contained in:
parent
10c1f2bcc4
commit
4797abb8b2
101
DS/C/test/sudoku.c
Normal file
101
DS/C/test/sudoku.c
Normal file
@ -0,0 +1,101 @@
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user