2918:Tudoku

keyword

C++

概要

ほとんど完成している数独が与えられる。空升を埋める問題。
なにせほとんど完成しているので、単に実装するだけの問題。

int board[9][9];

int main(){
    int i, j, k, h, n, x;
    scanf("%d\n",&n);

    for(int loop = 1; loop <= n; loop++){
        REP(i,9)REP(j,9) board[i][j] = 0;

        REP(i,9)REP(j,9){
            char c;
            scanf("%c\n",&c);
            board[i][j] = c - '0';
        }

        for(int l=0; l<81; l++){
            //check row
            REP(i,9){
                int line = 0;
                REP(j,9)if(board[i][j]){
                    line |= 1<<board[i][j];
                }
                if(__builtin_popcount(line)==8){
                    REPONE(k,9)if(!(line & (1<<k))) break;
                    REP(j,9)if(!board[i][j])  board[i][j] = k;
                }
            }

            //check column
            REP(i,9){
                int line = 0;
                REP(j,9)if(board[j][i]){
                    line |= 1<<board[j][i];
                }
                if(__builtin_popcount(line)==8){
                    REPONE(k,9)if(!(line & (1<<k))) break;
                    REP(j,9)if(!board[j][i]) board[j][i] = k;
                }
            }

            //check block
            for(int left = 0; left < 9; left += 3){
                for(int top = 0; top < 9; top += 3){
                    int line = 0;
                    REP(i,3)REP(j,3)if(board[i+top][j+left]){
                        line |= 1<<board[i+top][j+left];
                    }
                    if(__builtin_popcount(line)==8){
                        REPONE(k,9)if(!(line & (1<<k))) break;
                        REP(i,3)REP(j,3)if(!board[i+top][j+left]){
                            board[i+top][j+left] = k;
                        }
                    }
                }
            }

        }

        printf("Scenario #%d:\n", loop);
        REP(i,9){
            REP(j,9){
                printf("%d",board[i][j]);
            }
            printf("\n");
        }
        if(loop < n) printf("\n");
    }
}