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で重複しているか見るだけ。