AOJ_0126 Puzzle

ものずごく実装問題。
さらに変な解き方をしたため、どこで何をしているコードなのか自分でも分からなくなった。

#include <cstdio>
#include <algorithm>
using namespace std;

typedef pair<bool, int> P;
int num[9][9];	//書いてある数字
int map[9][9];
bool  b[9][9];	//書いてある数字がOKか
P p[10]; //一時的に使う
void init_p(){
	for(int i = 0; i < 10; i++){
		p[i].first = false;
		p[i].second = -1;
	}
}
void c(){
	for(int i = 0; i < 9; i++){
		init_p();
		for(int j = 0; j < 9; j++){
			if(p[num[j][i]].first){
				b[p[num[j][i]].second][i] = false;
				b[j][i] = false;
			}else{
				p[num[j][i]].first = true;
				p[num[j][i]].second = j;
			}
		}
	}
	for(int i = 0; i < 9; i++){
		init_p();
		for(int j = 0; j < 9; j++){
			if(p[num[i][j]].first){
				b[i][p[num[i][j]].second] = false;
				b[i][j] = false;
			}else{
				p[num[i][j]].first = true;
				p[num[i][j]].second = j;
			}
		}
	}
	for(int i = 0; i < 9; i++){
		init_p();
		for(int j = 0; j < 9; j++){
			int x = i % 3 * 3 + j % 3, y = i / 3 * 3 + j / 3;
			if(p[num[x][y]].first){
				int tx = i % 3 * 3;
				for(int k = 0; k < 3; k++){
					if(num[tx + k][p[num[x][y]].second] == num[x][y]){
						b[tx + k][p[num[x][y]].second] = false;
					}
				}
				b[x][y] = false;
			}else{
				p[num[x][y]].first = true;
				p[num[x][y]].second = y;
			}
		}
	}
}
int main(){
	int n;
	scanf("%d", &n);
	for(int k = 0; k < n; k++){
		for(int i = 0; i < 9; i++){
			for(int j = 0; j < 9; j++){
				scanf("%d", &num[j][i]);
				b[j][i] = true;
			}
		}
		c();
		for(int i = 0; i < 9; i++){
			for(int j = 0; j < 9; j++){
				if(b[j][i]) printf(" ");
				else printf("*");
				printf("%d", num[j][i]);
			}
			printf("\n");
		}
		if(k < n - 1) printf("\n");
	}
	return 0;
}