2918:Tudoku
keyword
概要
ほとんど完成している数独が与えられる。空升を埋める問題。
なにせほとんど完成しているので、単に実装するだけの問題。
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"); } }