C/C++の宿題を片付けます 66代目

このエントリーをはてなブックマークに追加
7デフォルトの名無しさん
んじゃ俺も吸う毒〜

#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');
    }
}
8デフォルトの名無しさん:2006/07/20(木) 20:21:37
あー、なるほど。1〜9の有無チェックだからフラグ立てていけるんだ。