| ||||
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define nul(a) memset(a,0,sizeof(a)) int cnts[50]; char use[100][100]; int a[100][100]; struct pos { int i,v; void init(int _i,int _v) { i=_i; v=_v; } bool operator<(pos p) const { return v<p.v; } } p[50]; int _p[50],n,m; char mn[100]; int s[10000][2]; int down[100]; void init(int u,int i,int j) { s[u][0]=i; s[u][1]=j; } int fil(int i,int j) { int u=1,c=a[i][j],d; init(0,i,j); use[i][j]=1; for (d=0;d<u;d++) { i=s[d][0]; j=s[d][1]; if (i&&!use[i-1][j]&&a[i-1][j]==c) { init(u++,i-1,j); use[i-1][j]=1; } if (i+1<n&&!use[i+1][j]&&a[i+1][j]==c) { init(u++,i+1,j); use[i+1][j]=1; } if (j&&!use[i][j-1]&&a[i][j-1]==c) { init(u++,i,j-1); use[i][j-1]=1; } if (j+1<m&&!use[i][j+1]&&a[i][j+1]==c) { init(u++,i,j+1); use[i][j+1]=1; } } return u; } void del(int i,int j) { int u=1,c=a[i][j],d,z; init(0,i,j); a[i][j]=-1; nul(mn); for (d=0;d<u;d++) { i=s[d][0]; j=s[d][1]; if (mn[j]<i) mn[j]=i; if (i&&a[i-1][j]==c) { init(u++,i-1,j); a[i-1][j]=-1; } if (i+1<n&&a[i+1][j]==c) { init(u++,i+1,j); a[i+1][j]=-1; } if (j&&a[i][j-1]==c) { init(u++,i,j-1); a[i][j-1]=-1; } if (j+1<m&&a[i][j+1]==c) { init(u++,i,j+1); a[i][j+1]=-1; } } for (j=0;j<m;j++) { for (z=i=mn[j];i>=down[j];i--) if (a[i][j]+1) a[z--][j]=a[i][j]; for (;z>=down[j];z--) a[z][j]=-1; } for (d=0;d<u;d++) down[s[d][1]]++; } int main() { #ifdef pperm freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int ti,tests,c,i,j,k,mn,mi,mj,cur; scanf("%d",&tests); for (ti=0;ti<tests;ti++) { nul(down); nul(cnts); printf("Y\n"); scanf("%d%d%d",&n,&m,&c); for (i=0;i<n;i++) for (j=0;j<m;j++) { scanf("%d",&a[i][j]); cnts[a[i][j]]++; } for (i=0;i<c;i++) p[i].init(i,cnts[i]); /*for (i=0;i<c-1;i++) for (j=0;j<c-i-1;j++) if (cnts[p[j]]>cnts[p[j+1]]) { p[j]^=p[j+1]; p[j+1]^=p[j]; p[j]^=p[j+1]; }*/ sort(p,p+c); for (i=0;i<c;i++) _p[p[i].i]=i; for (i=0;i<n;i++) for (j=0;j<m;j++) a[i][j]=_p[a[i][j]]; if (c==4) { nul(use); mn=1; for (k=0;k<c-4;) { up4: mn=0; for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (a[i][j]+1&&a[i][j]<=k) { if (fil(i,j)>1) { del(i,j); printf("%d %d\n",i,j); nul(use); mn=1; } } if (!mn) k++; } k=c-5; mn=12345; for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (!use[i][j]&&a[i][j]==c-4) { cur=fil(i,j); if (cur>1&&cur<mn) { mi=i; mj=j; mn=cur; } } if (mn!=12345) { del(mi,mj); printf("%d %d\n",mi,mj); nul(use); goto up4; } for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (!use[i][j]&&a[i][j]==c-3) { cur=fil(i,j); if (cur>1&&cur<mn) { mi=i; mj=j; mn=cur; } } if (mn!=12345) { del(mi,mj); printf("%d %d\n",mi,mj); nul(use); goto up4; } for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (!use[i][j]&&a[i][j]==c-2) { cur=fil(i,j); if (cur>1&&cur<mn) { mi=i; mj=j; mn=cur; } } if (mn!=12345) { del(mi,mj); printf("%d %d\n",mi,mj); nul(use); goto up4; } for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (!use[i][j]&&a[i][j]==c-1) { cur=fil(i,j); if (cur>1&&cur<mn) { mi=i; mj=j; mn=cur; } } if (mn!=12345) { del(mi,mj); printf("%d %d\n",mi,mj); nul(use); goto up4; } printf("-1 -1\n"); } else if (c<=5||(p[c-1].v+p[c-2].v+p[c-3].v)*5>=n*m*2) { nul(use); mn=1; for (k=0;k<c-3;) { up3: mn=0; for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (a[i][j]+1&&a[i][j]<=k) { if (fil(i,j)>1) { del(i,j); printf("%d %d\n",i,j); nul(use); mn=1; } } if (!mn) k++; } k=c-4; mn=12345; for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (!use[i][j]&&a[i][j]==c-3) { cur=fil(i,j); if (cur>1&&cur<mn) { mi=i; mj=j; mn=cur; } } if (mn!=12345) { del(mi,mj); printf("%d %d\n",mi,mj); nul(use); goto up3; } for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (!use[i][j]&&a[i][j]==c-2) { cur=fil(i,j); if (cur>1&&cur<mn) { mi=i; mj=j; mn=cur; } } if (mn!=12345) { del(mi,mj); printf("%d %d\n",mi,mj); nul(use); goto up3; } for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (!use[i][j]&&a[i][j]==c-1) { cur=fil(i,j); if (cur>1&&cur<mn) { mi=i; mj=j; mn=cur; } } if (mn!=12345) { del(mi,mj); printf("%d %d\n",mi,mj); nul(use); goto up3; } printf("-1 -1\n"); } else if ((p[c-1].v+p[c-2].v)*7>=n*m*2) { nul(use); mn=1; for (k=0;k<c-2;) { up2: mn=0; for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (a[i][j]+1&&a[i][j]<=k) { if (fil(i,j)>1) { del(i,j); printf("%d %d\n",i,j); nul(use); mn=1; } } if (!mn) k++; } k=c-3; mn=12345; for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (!use[i][j]&&a[i][j]==c-2) { cur=fil(i,j); if (cur>1&&cur<mn) { mi=i; mj=j; mn=cur; } } if (mn==12345) mn=0; if (mn) { del(mi,mj); printf("%d %d\n",mi,mj); nul(use); goto up2; } mn=12345; for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (!use[i][j]&&a[i][j]==c-1) { cur=fil(i,j); if (cur>1&&cur<mn) { mi=i; mj=j; mn=cur; } } if (mn==12345) mn=0; if (mn) { del(mi,mj); printf("%d %d\n",mi,mj); nul(use); goto up2; } printf("-1 -1\n"); } else { nul(use); for (k=0;k<c-1;) { up: mn=0; for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (a[i][j]+1&&a[i][j]<=k) { if (fil(i,j)>1) { del(i,j); printf("%d %d\n",i,j); nul(use); mn=1; } } if (!mn) k++; } mn=12345; for (j=0;j<m;j++) for (i=down[j];i<n;i++) if (!use[i][j]&&a[i][j]==c-1) { cur=fil(i,j); if (cur>1&&cur<mn) { mi=i; mj=j; mn=cur; } } if (mn!=12345) { del(mi,mj); printf("%d %d\n",mi,mj); nul(use); k=c-2; goto up; } printf("-1 -1\n"); } } return 0; } |
||||
|