/** 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);

}