/**
ACSL Intermediate-3 Division
*
Contest #2: SUDOKU
* C++
Implementation by Harry Bock
*
LaSalle Academy, Providence, RI
**/
#include
<stdio.h>
#define
GRID(x) (x > 0 && x < 4) ? 1 : ((x > 3 && x < 7) ?
2 : 3)
static
int board[10][10];
int
get_row_flags( int row )
{
int temp_flags = 0;
for(int i = 1; i < 10; i++)
if(board[row][i])
temp_flags |= 1 << ( board[row][i]-1 );
return ~temp_flags & 0x1FF;
}
int
get_col_flags( int col )
{
int temp_flags = 0;
for(int i = 1; i < 10; i++)
if(board[i][col])
temp_flags |= 1 << ( board[i][col]-1 );
return ~temp_flags & 0x1FF;
}
int
get_grid_flags( int row, int col )
{
int grid_row = GRID(row),
grid_col = GRID(col), temp_flags = 0;
row = 1 + 3 * (grid_row - 1);
col = 1 + 3 * (grid_col - 1);
for(int i = row; i < row + 3;
i++)
for(int
j = col; j < col + 3; j++)
if(board[i][j]) temp_flags |= 1
<< ( board[i][j]-1 );
return ~temp_flags & 0x1FF;
}
void
main( void )
{
FILE *input =
fopen("sudoku.txt", "rb");
for(int i = 1; i < 10; i++)
for(int
j = 1; (j < 10) && !feof(input); j++)
fscanf(input, "%i",
&board[i][j]);
for(int i = 0; i < 5; i++)
{
int
row = 0, col = 0, bitans = 0, digit = 1;
fscanf(input,
"%i %i", &row, &col);
bitans
= get_row_flags(row) & get_col_flags(col) & get_grid_flags(row,col);
for(int
n = 0; n <= 9 && bitans != 0x01; n++) bitans = bitans >> 1;
board[row][col]
= ++n;
printf("(%i,%i)
= %i\n", row, col, n);
}
fclose(input);
}