//盤面データ構造体
struct sudoku_t {
int cell[9][9];
};
//・(r,c)に数字kが入る可能性を消す関数a
//マス(r,c)には1~9のいずれかの数字が入ります。(要は数独です)(r,c)に9ビットの状態数が与えられていて、
//たとえば(r,c)のマスに3,6,9の数字が入る可能性がある事を100100100という状態数で表しています。
//もし(r,c)の状態数が000000100となると、(r,c)に3が入ることが確定します。
//たとえば110101110のとき、kが2なら、この関数aによって110101100というようにします。
//このとき、元から0であり変更がなかったなら0を、1を0に変更したら1を返すようにします。
int sudoku_del(struct sudoku_t *s, int r, int c, int k) {
if ((s->cell[r][c] & ~(0001 << (k-1))) != s->cell[r][c]) {
s->cell[r][c] = (s->cell[r][c] & ( ~(0001 << (k-1)) ) );
return 1;
}
else {return 0;}
}
//・横一列に同じ数字は入り得ないとする関数b
//この関数で実際に変更を受けたマスの数を戻り値として返すようにします。
//このとき(r,c)以外のc列に3が入る可能性を消す関数です。
int sudoku_del_col(struct sudoku_t *s, int r, int c){
int k,r1,n;
n=0;
for(k=1;k<=9;k++){
if((s->cell[r][c]) == (0001 <<(k-1))){
for(r1=0;r1<=8;r1++){
if(r1==r){continue;}
sudoku_del(s,r1,c,k);
if(sudoku_del(s,r1,c,k)==1){n++;}
}
}
}
return n;
}