Saturday, January 19, 2013

THE SUDOKU (NxN) SOLVER IN C

//The only requirement is that N is a perfect square, 4, 9, 16.....
//IN CASE OF DOUBT, KINDLY COMMENT IT

# include<stdio.h>
# include<math.h>
# define N 4
# define SQ ((int)(sqrt(N)))
int check(int a[][N], int b, int c, int val)
{
int i, j;
for(i = 0; i < N; i++)
{
if(a[b][i] == val || a[i][c] == val)
{
return 0;
}
}
for(i = b-(b % SQ); i < b + (SQ - (b % SQ)); i++)
{
for(j = c-(c % SQ); j < c + (SQ - (c % SQ)); j++)
{
if(a[i][j] == val)
{
return 0;
}
}
}
return 1;
}
void input(int a[][N])
{
int i = 1;
int b,c, d;
while(i > 0)
{
scanf("%d, %d, %d", &b, &c, &d);
a[b][c] = d;
scanf("%d", &i);
}
}
void main()
{
int a[N][N], val = 1, i , j, b[N][N], k, l, m;
for(i = 0; i < N; i++)
{
for(j = 0; j < N ; j++)
{
a[i][j] = 0;
b[i][j] = 0;
}
}
printf("THIS IS A %d BY %d MATRIX\n", N,N);
printf("INPUT IN THE FORMAT: X(0-%d), Y(0-%d), VAL(1-%d)\n", N-1, N-1, N);
printf("ENTER 0 TO STOP INPUTTING AND 1 TO CONTINUE\n");
input(a);
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
val = 1;
if (a[i][j] == 0)
{
reloop:
if(check(a,i,j,val) == 1)
{
a[i][j] = val;
b[i][j] = 1;
continue;
}
else
{
restart:
if(val < N)
{
val++;
goto reloop;
}
else
{
a[i][j] = 0;
b[i][j] = 0;
l = 0;
retry:
for(k = 0; k < N; k++)
{

if(b[i][k] == 1)
{
l++;
m = k;
}
}
if(l == 0)
{
i--;
goto retry;
}
val = a[i][m];
a[i][m] = 0;
b[i][m] = 0;
j = m;
goto restart;
}
}
}
}
}
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
}