AOJ 0126 - Puzzle

自分でも汚いと思っているので,改善したい.

#include <iostream>
#include <cstring>

int main(){
	int n, f = 0;
	std::cin >> n;
	while(n--){
		if(f++)std::cout << "\n";
		int sudoku[9][9], map[9][9];
		memset(map, 0, sizeof(map));
		for(int i=0;i<81;i++)
			std::cin >> sudoku[i/9][i%9];
		
		int check[10][2];

		for(int i=0;i<9;i++){
			memset(check, -1, sizeof(check));
			for(int j=0;j<9;j++){
				int x = check[sudoku[i][j]][1],
					y = check[sudoku[i][j]][0];
				if(x != -1){
					map[y][x] = 1;
					map[i][j] = 1;
				}
				
				check[sudoku[i][j]][0] = i;
				check[sudoku[i][j]][1] = j;
			}
		}
		
		for(int i=0;i<9;i++){
			memset(check, -1, sizeof(check));
			for(int j=0;j<9;j++){
				int x = check[sudoku[j][i]][1],
					y = check[sudoku[j][i]][0];
				if(x != -1){
					map[y][x] = 1;
					map[j][i] = 1;
				}
				
			check[sudoku[j][i]][0] = j;
			check[sudoku[j][i]][1] = i;
			}
		}
		
		for(int i=0;i<9;i++){
			int sx = i % 3, sy = i / 3;//左上の基準点
			memset(check, -1, sizeof(check));
			for(int j=0;j<3;j++){
				for(int k=0;k<3;k++){
					int x = check[sudoku[sy*3+j][sx*3+k]][1],
						y = check[sudoku[sy*3+j][sx*3+k]][0];
					if(x != -1){
						map[y][x] = 1;
						map[sy*3+j][sx*3+k] = 1;
					}
					
					check[sudoku[sy*3+j][sx*3+k]][0] = sy*3+j;
					check[sudoku[sy*3+j][sx*3+k]][1] = sx*3+k;
				}
			}
		}
		
		for(int i=0;i<9;i++){
			for(int j=0;j<9;j++){
				if(map[i][j])
					std::cout << "*" << sudoku[i][j];
				else
					std::cout << " " << sudoku[i][j];
			}
			std::cout << "\n";
		}
	}
}