んじゃ俺も吸う毒〜
#include<stdio.h>
char block[9][9];
int flag[3][9];
int solve(int,int);
int next(int x,int y,int i){
char tmp = block[y][x];
if((flag[0][x]>>i|flag[1][y]>>i|flag[2][x/3*3+y/3]>>i)&1)return 0;
flag[0][x]|=1<<i;flag[1][y]|=1<<i;flag[2][x/3*3+y/3] |= 1<<i;
block[y][x] = i+'0';
if(solve(x+1,y))return 1;
block[y][x] = tmp;
flag[2][x/3*3+y/3]&=~(1<<i);flag[1][y]&=~(1<<i);flag[0][x]&=~(1<<i);
return 0;
}
int solve(int x,int y){
int i;
if(x == 9)x=0,++y;if(y == 9)return 1;
if(block[y][x]!='_')return next(x,y,block[y][x]-'0');
for(i=1;i<=9;++i)if(next(x,y,i))return 1;
return 0;
}
int main(){
int y,x;
for(y=0;y<9;++y)for(x=0;x<9;++x)scanf(" %c",&block[y][x]);
solve(0,0);
for(y=0;y<9;++y){
for(x=0;x<9;++x)putchar(block[y][x]);
putchar('\n');
}
}
あー、なるほど。1〜9の有無チェックだからフラグ立てていけるんだ。