//盤面データ構造体
struct aa_t {
int cell[9][9];
};
//・(r,c)に数字kは入らないとする関数
//マス(r,c)に9ビットの状態数が与えられています。
//たとえば110101110のとき、kが2なら、この関数によって110101100というようにします。
//このとき、元から0であり変更がなかったなら0を、1を0に変更したら1を返すようにします。
int aa_del(struct aa_t *s, int r, int c, int k) {
if((s->cell[r][c] & (0001 << (k-1))) == 0000){return 0;}
else {s->cell[r][c] = (s->cell[r][c] & ( ~(0001 << (k-1)) ) );return 1;}
}
//・横一列に同じ数字は入り得ないとする関数
//(r,c)には1~9のいずれかの数字が入ります。
//たとえば(r,c)のマスに3,6,9の数字が入る可能性がある事を100100100という状態数で表しています。
//もし(r,c)の状態数が000000100となると、(r,c)に3が入ることが確定します。
//このときc列に3が入る可能性を消す関数です。(もちろん(r,c)以外の)
//そしてこの関数で実際に変更を受けたマスの数を戻り値として返すようにします。
int aa_del_col(struct aa_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;}
aa_del(s,r1,c,k);
if(aa_del(s,r1,c,k)==1){n++;}
}
}
}
return n;
}
//上記のように考えましたが、この実際に変更を受けたマスの数を戻り値として返すようにする、
//という動作がうまく働きません。よろしくお願いします。