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; }