For sudoku you need three steps -
1. Horizontal no number should get repeated.
2. Vertical no number should get repeated.
3. At the grid no number should get repeated.
Following program is the 9*9 matrix -
int flag = 0; /* 1 - Error, 0 - Success */
int main(int argc, char *argv[])
{
FILE *data;
char buffer[9];
char matrix[9][9];
int c;
int i = 0, j = 0;
data = fopen("myFile.dat", "r");
/* Reading the Matrix from file */
while ((c = getc(data)) != EOF)
{
if (c == ' ')
continue;
else if (c == '\n')
{
i = 0;
j++;
}
else
matrix[j][i++] = c;
}
/* Horizontal check */
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
buffer[j] = matrix[i][j];
if (check(buffer) != 0)
printNotValid(buffer, HORIZONTAL_CHECK, i);
}
/* Vertical check */
for (j = 0; j < 9; j++)
{
for (i = 0; i < 9; i++)
{
buffer[i] = matrix[i][j];
}
if (check(buffer) != 0)
printNotValid(buffer, VERTICAL_CHECK, j);
}
/* Submatrix check */
int count = 0;
int icount = 0;
int jcount = 0;
int matcount = 0;
for (i = 0; i <= 6; i+= 3)
{
for (j = 0; j <= 6; j += 3)
{
for (icount = 0, count = 0; icount < 3; icount++)
{
for (jcount = 0; jcount < 3; jcount++)
{
buffer[count++] = matrix[i+icount][j+jcount];
}
}
++matcount;
if (check(buffer) != 0)
printNotValid(buffer, SUBMATIX_CHECK, matcount);
}
}
if (flag == 0)
printf("\n The Sudoku is correct :)");
printf("\n");
return 0;
}
int check(char *array)
{
int i, count;
for (i = 0; i < 9; i++)
{
count = i;
while (count < 9)
{
if (array[i] == array[++count])
return 1;
}
}
return 0;
}
int printNotValid(char *array, int type, int errorLocation)
{
int i;
flag = 1;
if (type == HORIZONTAL_CHECK)
{
printf("\n Found error at row %d: \n\t", ++errorLocation);
for (i = 0; i < 9; i++)
printf("%c ", array[i]);
}
else if (type == VERTICAL_CHECK)
{
printf("\n Found error at column %d: \n", ++errorLocation);
for (i = 0; i < 9; i++)
printf("\n\t %c ", array[i]);
}
else if (type == SUBMATIX_CHECK)
{
printf("\n Found error at Submatrix %d: \n", errorLocation);
for (i = 0; i < 9; i++)
{
printf("%c ", array[i]);
if ((i == 2) || (i == 5))
printf("\n");
}
}
}