#include <bits/stdc++.h> #define xi first.first #define yi first.second #define ii second using namespace std; int n, xmin, ymin, X, Y; int L[3000], L1[3000]; bool B[100][100]; pair < pair <int,int> , int > P[3000]; bool solve() { for(int i=0; i<X; i++) for(int j=0; j<Y; j++) B[i][j]=false; for(int i=0; i<n; i++) for(int j=0; j<L[i]; j++) for(int k=0; k<L[i]; k++) if(B[P[i].xi+j][P[i].yi+k]) return false; else B[P[i].xi+j][P[i].yi+k]=true; for(int i=0; i<X; i++) for(int j=0; j<Y; j++) if(!B[i][j]) return false; return true; } void testcase_mosaic() { cin >> n; xmin=ymin=(1<<30); for(int i=0; i<n; i++){ cin >> P[i].xi >> P[i].yi; xmin = min(xmin,P[i].xi); ymin = min(ymin,P[i].yi); P[i].ii=i; } for(int i=0; i<n; i++){ P[i].xi-=xmin; P[i].yi-=ymin; } sort(&P[0],&P[n]); if(P[0].xi!=0 || P[0].yi!=0){ cout << "NIE\n"; return; } if(n==1){ cout << "TAK 1\n"; return; } if(n==2){ if(P[0].xi==P[1].xi){ cout << "TAK " << abs(P[1].yi-P[0].yi) << " " << abs(P[1].yi-P[0].yi) << "\n"; return; } if(P[0].yi==P[1].yi){ cout << "TAK " << abs(P[1].xi-P[0].xi) << " " << abs(P[1].xi-P[0].xi) << "\n"; return; } cout << "NIE\n"; return; } int b=5, b1=1, k; if(n>=8) b=4; if(n>=10) b=3; if(n>=13) b=2; if(n>=20) b=1; for(int j=0; j<n; j++) b1*=b; for(int j=0; j<b1; j++){ k=j, X=Y=0; for(int i=0; i<n; i++){ L[i]=(k%b)+1; k/=b; X=max(X,P[i].xi+L[i]); Y=max(Y,P[i].yi+L[i]); } if(solve()){ cout << "TAK"; for(int i=0; i<n; i++) L1[P[i].ii]=L[i]; for(int i=0; i<n; i++) cout << " " << L1[i]; cout <<"\n"; return; } } cout << "NIE\n"; return; } int main() { ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0); int Z; cin >> Z; while(Z--) testcase_mosaic(); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #include <bits/stdc++.h> #define xi first.first #define yi first.second #define ii second using namespace std; int n, xmin, ymin, X, Y; int L[3000], L1[3000]; bool B[100][100]; pair < pair <int,int> , int > P[3000]; bool solve() { for(int i=0; i<X; i++) for(int j=0; j<Y; j++) B[i][j]=false; for(int i=0; i<n; i++) for(int j=0; j<L[i]; j++) for(int k=0; k<L[i]; k++) if(B[P[i].xi+j][P[i].yi+k]) return false; else B[P[i].xi+j][P[i].yi+k]=true; for(int i=0; i<X; i++) for(int j=0; j<Y; j++) if(!B[i][j]) return false; return true; } void testcase_mosaic() { cin >> n; xmin=ymin=(1<<30); for(int i=0; i<n; i++){ cin >> P[i].xi >> P[i].yi; xmin = min(xmin,P[i].xi); ymin = min(ymin,P[i].yi); P[i].ii=i; } for(int i=0; i<n; i++){ P[i].xi-=xmin; P[i].yi-=ymin; } sort(&P[0],&P[n]); if(P[0].xi!=0 || P[0].yi!=0){ cout << "NIE\n"; return; } if(n==1){ cout << "TAK 1\n"; return; } if(n==2){ if(P[0].xi==P[1].xi){ cout << "TAK " << abs(P[1].yi-P[0].yi) << " " << abs(P[1].yi-P[0].yi) << "\n"; return; } if(P[0].yi==P[1].yi){ cout << "TAK " << abs(P[1].xi-P[0].xi) << " " << abs(P[1].xi-P[0].xi) << "\n"; return; } cout << "NIE\n"; return; } int b=5, b1=1, k; if(n>=8) b=4; if(n>=10) b=3; if(n>=13) b=2; if(n>=20) b=1; for(int j=0; j<n; j++) b1*=b; for(int j=0; j<b1; j++){ k=j, X=Y=0; for(int i=0; i<n; i++){ L[i]=(k%b)+1; k/=b; X=max(X,P[i].xi+L[i]); Y=max(Y,P[i].yi+L[i]); } if(solve()){ cout << "TAK"; for(int i=0; i<n; i++) L1[P[i].ii]=L[i]; for(int i=0; i<n; i++) cout << " " << L1[i]; cout <<"\n"; return; } } cout << "NIE\n"; return; } int main() { ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0); int Z; cin >> Z; while(Z--) testcase_mosaic(); return 0; } |