Puzzle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0126数独で間違った回答の間違ってる部分にチェックをつける問題。
行、列 3*3で数えて2つ以上重なってるものに*をつけるだけです。
結構エレガントに書けた気はするがショートコーダーから見たらきっとこのコードは長い。
700バイト12位、特にショートコードを狙ったわけでもないのでまあまあの順位に思えるが。
1位は264バイトなので2位以下か1位かという区別しか意味がない。
#include<stdio.h>
#include<string.h>
void check(){
int rows[9][10],cols[9][10],cell33[3][3][10];
int board[9][9],num;
memset(cell33,0,sizeof(cell33));
memset(rows,0,sizeof(rows));
memset(cols,0,sizeof(cols));
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
scanf("%d",&num);
rows[i][num]++;
cols[j][num]++;
cell33[i/3][j/3][num]++;
board[i][j]=num;
}
}
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
int num=board[i][j];
if(rows[i][num]>1||cols[j][num]>1||cell33[i/3][j/3][num]>1){
printf("*%d",num);
}else{
printf(" %d",num);
}
}
printf("\n");
}
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
check();
if(i+1<n)printf("\n");
}
}
0 件のコメント:
コメントを投稿