0126 - Puzzle
#include <iostream> using namespace std; char data[9][9][2]; void CheckSide(int i) { int number[10]={0}; for (int j=0; j<9; ++j) ++number[data[i][j][0]-'0']; for (int j=0; j<9; ++j) if (number[data[i][j][0]-'0'] > 1) data[i][j][1]=1; } void CheckLength(int j) { int number[10]={0}; for (int i=0; i<9; ++i) ++number[data[i][j][0]-'0']; for (int i=0; i<9; ++i) if (number[data[i][j][0]-'0'] > 1) data[i][j][1]=1; } void CheckRange(int i, int j) { int number[10]={0}; for (int a=0; a<3; ++a) for (int b=0; b<3; ++b) ++number[data[i+a][j+b][0]-'0']; for (int a=0; a<3; ++a) for (int b=0; b<3; ++b) if (number[data[i+a][j+b][0]-'0'] > 1) data[i+a][j+b][1]=1; } void Slove(int n) { bool flg=false; for (int k=0; k<n; ++k) { (flg)? cout << endl : flg=true; for (int i=0; i<9; ++i) for (int j=0; j<9; ++j) { cin >> data[i][j][0]; data[i][j][1]=0; } for (int i=0; i<9; ++i) CheckSide(i); for (int j=0; j<9; ++j) CheckLength(j); for (int i=0; i<=6; i+=3) for (int j=0; j<=6; j+=3) CheckRange(i,j); for (int i=0; i<9; ++i) { for (int j=0; j<9; ++j) { if (data[i][j][1] == 1) cout << "*"; else cout << " "; cout << data[i][j][0]; } cout << endl; } } } int main(void) { int n; cin >> n; Slove(n); return 0; }
縦、横、3✕3で重複しているか見るだけ。