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
| #include <bits/stdc++.h> using namespace std;
const int N = 55;
int a[N][N], row[N][N], col[N][N]; int b[N], inq[N]; int q1[N], q2[N]; int T, n, k;
int getans(int k, int n) { if(n==0) return k==0?1:-1; if(n==1) return -1; if(k%n==0) { q1[++q1[0]]=k/n; q2[q1[0]]=n; return 1; } if(k<n) return -1; for(int i=k/n; i>0; i--) { q1[++q1[0]]=i; for(int j=min(n, k/i); j>=2; j--) { q2[q1[0]]=j; int t=getans(k-i*j, n-j); if(t==1) return 1; } --q1[0]; } return -1; }
int main() { cin >> T; for(int t=1; t<=T; t++) { cin >> n >> k; memset(a, 0, sizeof(a)); memset(row, 0, sizeof(row)); memset(col, 0, sizeof(col)); memset(b, 0, sizeof(b)); memset(inq, 0, sizeof(inq)); q1[0]=q2[0]=0; printf("Case #%d: ", t); if(getans(k, n)==-1) puts("IMPOSSIBLE"); else { puts("POSSIBLE");
int cnt=0; for(int i=1; i<=q1[0]; i++) { for(int j=1; j<=q2[i]; j++) { cnt++; a[cnt][cnt]=q1[i]; row[cnt][q1[i]]=1, col[cnt][q1[i]]=1; } } for(int i=1; i<=q1[0]; i++) inq[q1[i]]=1; for(int i=1; i<=q1[0]; i++) b[i]=q1[i]; for(int i=q1[0]+1, tt=1; i<=n; i++, tt++) { while(inq[tt]) tt++; b[i]=tt; } for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) if(inq[b[j]] && col[j][b[j]]) { int ff=0; for(int tt=j; tt<=n; tt++) if(!col[tt][b[j]]) { ff=tt; break; } if(!ff) for(int tt=1; tt<=j; tt++) if(!col[tt][b[j]]) { ff=tt; break; } if(!ff) continue; if(ff>j) for(int tt=j; tt<ff; tt++) swap(b[tt], b[tt+1]); else for(int tt=j; tt>ff; tt--) swap(b[tt], b[tt-1]); } for(int j=1; j<=n; j++) cout << b[j] << " "; cout << endl; for(int j=1; j<=n; j++) { if(!a[i][j]) { for(int u=1; u<=n; u++) if(!row[i][b[u]] && !col[j][b[u]]) { a[i][j]=b[u]; row[i][b[u]]=col[j][b[u]]=1; break; } } } for(int j=n; j>1; j--) swap(b[j], b[j-1]); } for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) printf("%d%c", a[i][j], " \n"[j==n]); } } return 0; }
|