C program to solve Sudoku puzzle
Here is a C program to solve sudoku. I have manually entered the puzzle in the array, if you want you can write a two line code to take input from user or just manually change the values in the array before running it.
Note: 0 represents the empty cell of sudoku puzzle
Here's the Code:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define RESET 0
int sudokuSolver();
int findEmptyCell();
int isValid();
void printGrid();
void inputGrid();
int grid[9][9]= { {0, 0, 5, 3, 0, 0, 0, 0, 0},
{8, 0, 0, 0, 0, 0, 0, 2, 0},
{0, 7, 0, 0, 1, 0, 5, 0, 0},
{4, 0, 0, 0, 0, 5, 3, 0, 0},
{0, 1, 0, 0, 7, 0, 0, 0, 6},
{0, 0, 3, 2, 0, 0, 0, 8, 0},
{0, 6, 0, 5, 0, 0, 0, 0, 9},
{0, 0, 4, 0, 0, 0, 0, 3, 0},
{0, 0, 0, 0, 0, 9, 7, 0, 0}
};
int row,col;
//this variable was used just to keep track of number of recursive calls
long int totalNumOfCalls=0;
void main(){
int i,j,solution=0;
char ch;
clrscr();
printf("You can change the puzzle before running the program \nby changing the values in the \"grid\" array\n\n");
printf("The Entered Sudoku puzzle is: \n");
printGrid();
printf("Press 'c' to confirm and solve, or 'e' to exit: ");
ch=getch();
if(ch=='e')
exit(0);
else if(ch=='c'){
clrscr();
solution=sudokuSolver();
if(solution){
printf("\nThe Solved Sudoku is: \n\n");
printGrid();
}
else
printf("\nNo Possible Solution!!\n\n");
getch();
}
}
int findEmptyCell(){
int i,j;
for(i=row;i<=8;i++)
for(j=0;j<=8;j++){
if(grid[i][j]==0)
{
row=i;col=j;
return 1;
}
}
return 0;
}
int isValid(int cellRow, int cellCol, int num){
int i,j,trow,tcol,trow1,tcol1;
int rowStart = (cellRow/3) * 3;
int colStart = (cellCol/3) * 3;
// to check the presence of number in row and column
for(j=0;j<=8;j++){
if(grid[cellRow][j]==num)
return 0;
if(grid[j][cellCol]==num)
return 0;
}
// to check the presence of number in 3X3 box
for(i=rowStart;i<=rowStart+2;i++)
for(j=colStart;j<=colStart+2;j++)
if(grid[i][j]==num)return 0;
return 1;
}
int sudokuSolver(){
int digit;
int prevRow,prevCol; // for backtracking
totalNumOfCalls++;
if(!findEmptyCell())
return 1;
for(digit=1;digit<=9;digit++){
if(isValid(row,col,digit)){
grid[row][col]=digit;
prevRow=row;prevCol=col;
if(sudokuSolver())
return 1;
//while backtracking assigning previous values to row and col
row=prevRow;col=prevCol;
grid[row][col]=RESET;
}
}
return 0;
}
void printGrid(){
int i,j;
printf("\t-------------------------\n");
for(i=0;i<9;i++){
printf("\t");
for(j=0;j<9;j++){
if(j==0)
printf("| ");
if(grid[i][j]==0)
printf(". ");
else
printf("%d ",grid[i][j]);
if((j+1)%3==0 )
printf("| ");
}
if((i+1)%3==0 )
printf("\n\t-------------------------");
printf("\n");
}
}





best code
ReplyDeletegreat !! thanks
ReplyDeleteGREAT!!!!!!!Thank You!!!!!!!!!
ReplyDeleteGreat!! It worked. Thanks for the solution.
ReplyDeleteThanks :)
ReplyDeletehow to enter number?
ReplyDelete