-
Notifications
You must be signed in to change notification settings - Fork 0
/
sudoku_solving.c
139 lines (119 loc) · 3.73 KB
/
sudoku_solving.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//THIS PROGRAM IS OF SUDOKU SOLVING//
//ABHISHEK DEOKAR
#include <stdio.h>
#include <stdlib.h>
// N is the size of the 2D matrix N*N
#define N 9
/* A utility function to print grid */
void print(int arr[N][N])
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
printf("%d ",arr[i][j]);
printf("\n");
}
}
// Checks whether it will be legal
// to assign num to the
// given row, col
int isSafe(int grid[N][N], int row,
int col, int num)
{
// Check if we find the same num
// in the similar row , we return 0
for (int x = 0; x <= 8; x++)
if (grid[row][x] == num)
return 0;
// Check if we find the same num in the
// similar column , we return 0
for (int x = 0; x <= 8; x++)
if (grid[x][col] == num)
return 0;
// Check if we find the same num in the
// particular 3*3 matrix, we return 0
int startRow = row - row % 3,
startCol = col - col % 3;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
if (grid[i + startRow][j +
startCol] == num)
return 0;
return 1;
}
/* Takes a partially filled-in grid and attempts
to assign values to all unassigned locations in
such a way to meet the requirements for
Sudoku solution (non-duplication across rows,
columns, and boxes) */
int solveSuduko(int grid[N][N], int row, int col)
{
// Check if we have reached the 8th row
// and 9th column (0
// indexed matrix) , we are
// returning true to avoid
// further backtracking
if (row == N - 1 && col == N)
return 1;
// Check if column value becomes 9 ,
// we move to next row and
// column start from 0
if (col == N)
{
row++;
col = 0;
}
// Check if the current position
// of the grid already contains
// value >0, we iterate for next column
if (grid[row][col] > 0)
return solveSuduko(grid, row, col + 1);
for (int num = 1; num <= N; num++)
{
// Check if it is safe to place
// the num (1-9) in the
// given row ,col ->we move to next column
if (isSafe(grid, row, col, num)==1)
{
/* assigning the num in the
current (row,col)
position of the grid
and assuming our assined num
in the position
is correct */
grid[row][col] = num;
// Checking for next possibility with next
// column
if (solveSuduko(grid, row, col + 1)==1)
return 1;
}
// Removing the assigned num ,
// since our assumption
// was wrong , and we go for next
// assumption with
// diff num value
grid[row][col] = 0;
}
return 0;
}
int main()
{
// 0 means unassigned cells
int grid[N][N] = { { 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 (solveSuduko(grid, 0, 0)==1){
printf("Your solved Sudoku is :\n");
print(grid);
}
else{
printf("No solution exists");
}
return 0;
}