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
| #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cstdlib> using namespace std; #define MAXN 1000 #define range(x,y) (x>=0&&x<N&&y>=0&&y<M) #define f(a,b) (((a)+(b))%3) #define getx(i,j) ((i)*M+(j)) #define geti(x) ((x)/M) #define getj(x) ((x)-(x)/M*M) int N,M; int mp[35][35]; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; int x[MAXN]; int g[MAXN][MAXN]; int var,equ; inline void uniqueans(int var) { for(int i=var-1;i>=0;i--){ if(!g[i][i]){ x[i]=0; continue; } int tmp=g[i][var]; for(int j=i+1;j<var;j++){ int v=((g[i][j]==0)?0:3-g[i][j]); tmp+=v*x[j]; } if(tmp%g[i][i]==0) x[i]=tmp/g[i][i]; else if((tmp+3)%g[i][i]==0) x[i]=(tmp+3)/g[i][i]; else x[i]=0; x[i]%=3; } } inline int gauss(int equ,int var) { int col,k,maxr; for(k=0,col=0;k<equ&&col<var;k++,col++){ maxr=k; for(int i=k+1;i<equ;i++) if(abs(g[maxr][col])<abs(g[i][col])) maxr=i; if(maxr!=k) for(int i=col;i<=var;i++) swap(g[k][i],g[maxr][i]); if(g[k][col]==0){ k--;continue; } for(int i=k+1;i<equ;i++) if(g[i][col]!=0){ int v=((g[i][col]+g[k][col]==3)?1:2); for(int j=col;j<=var;j++) g[i][j]=f(g[i][j],v*g[k][j]); } } for(int i=k;i<equ;i++) if(g[i][var]!=0) return -1; uniqueans(var); return 0; } int main() { int T,t; scanf("%d",&T); while(T--){ memset(g,0,sizeof(g)); memset(x,0,sizeof(x)); scanf("%d%d",&N,&M); var=equ=N*M; for(int i=0;i<N;i++){ for(int j=0;j<M;j++){ scanf("%d",&t); g[getx(i,j)][var]=t==0?0:3-t; g[getx(i,j)][getx(i,j)]=2; for(int k=0;k<4;k++){ int x=i+dx[k],y=j+dy[k]; if(range(x,y)) g[getx(i,j)][getx(x,y)]=1; } } } int err=gauss(equ,var); int cnt=0; for(int i=0;i<var;i++) cnt+=(x[i]%=3); printf("%d\n",cnt); for(int i=0;i<var;i++){ while(x[i]--) printf("%d %d\n",geti(i)+1,getj(i)+1); } } return 0; }
|