質問の意味:
グリッド線$ $ $ M $のn列を染色するなかで、満足します。
1.ブラックグリッド二百二十から四ユニコム、二百二十から四ユニコム白格子、黒と白を介して格子は格子と一致するように回転し、平行移動することが可能に
W 2は$(WX、WY)この格子は、白$ bは$(BX、によって)$このグリッドは黒です。
いずれかへの解決策を見つけるために必要な、または解決策が決定されていません。複数のデータセット。
$ 1 \とT \ 10 ^ 3 \、1 \ nは、50 \ M、\、1 \とWX、BXを\ n \。1 \ワイオミング、\ M、\によって、$(によるBX、)(WX、WY)の\ NEQ
分析:
まず、無ソリューションについて考えます。
①グリッド数は、奇数で共有していません
②単一の行/単一の行とは、同じ側に黒と白のグリッドを指定等分することができません
次のカテゴリートーク:
①$ IF 2 | Mの$(図回転自在全体$スルー90 ^ {\ CIRC} $は、以下、同じ入手)、および正中線を分離された二つの指定された点は、直接切断されます。
②指定された点が異なる行の同側中間生き、そして場合図で上述したように、染色することができます。
指定された中間点は反対側に住んでいる、そして同じ行に場合③、中心線の近くに指定された点から上記に示した染色することができるように、最終行ではありません。
実装:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<queue> #define IL inline #define UI unsigned int #define RI register int using namespace std; const int N=50; IL void swap(int &x,int &y){ int t=x; x=y; y=t; } int T,n,m,wx,wy,bx,by; bool flag1,flag2,flag3,flag4; int nn,mm,c,d,x[2],y[2]; int bod[N+3][N+3]; IL void step1(){ if(n*m%2==1){ flag1=true; return ; } x[0]=wx; y[0]=wy; x[1]=bx; y[1]=by; if(m%2==1){ flag2=true; swap(n,m); for(int i=0;i<2;i++) swap(x[i],y[i]); } mm=m/2; if(n==1&&((y[0]<=mm&&y[1]<=mm)||(y[0]>mm&&y[1]>mm))){ flag1=true; return ; } } IL bool cmp1(){ if(y[0]==y[1]) return x[0]<x[1]; return y[0]<y[1]; } IL bool cmp2(){ if(x[0]==x[1]) return y[0]<y[1]; return x[0]<x[1]; } IL void sol1(){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) bod[i][j]=(j<=mm)?c:d; } IL void sol2(){ int vx[2]; for(int i=0;i<2;i++) vx[i]=n-x[i]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) bod[i][j]=(i<=(j<=mm?x[c]:vx[c]))?c:d; } IL void sol3(){ int vx[2]; for(int i=0;i<2;i++) vx[i]=n-x[i]+1; int vy[2]; for(int i=0;i<2;i++) vy[i]=m-y[i]+1; memset(bod,-1,sizeof bod); for(int i=1;i<=x[d];i++) for(int j=y[d];j<=mm;j++) bod[i][j]=d; for(int i=vx[d];i<=n;i++) for(int j=mm+1;j<=vy[d];j++) bod[i][j]=c; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(!~bod[i][j]) bod[i][j]=(j<=mm)?c:d; } IL void step2(){ c=cmp1()?0:1; d=c^1; if(y[c]<=mm&&y[d]>mm){ sol1(); return ; } if(y[c]>mm){ flag3=true; for(int i=0;i<2;i++) y[i]=m-y[i]+1; c=cmp1()?0:1; d=c^1; } if(x[d]==n){ flag4=true; for(int i=0;i<2;i++) x[i]=n-x[i]+1; } c=cmp2()?0:1; d=c^1; if(x[c]!=x[d]) sol2(); else sol3(); } IL void step3(){ if(flag4) for(int i=1,ti=n;i<ti;i++,ti--) for(int j=1;j<=m;j++) swap(bod[i][j],bod[ti][j]); if(flag3) for(int i=1;i<=n;i++) for(int j=1,tj=m;j<=mm;j++,tj--) swap(bod[i][j],bod[i][tj]); if(flag2){ int tmp[N+3][N+3]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) tmp[j][i]=bod[i][j]; memcpy(bod,tmp,sizeof bod); swap(n,m); } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) printf("%d ",bod[i][j]); printf("\n"); } } int main(){ freopen("A.in","r",stdin); freopen("A.out","w",stdout); scanf("%d",&T); while(T--){ scanf("%d%d%d%d%d%d",&n,&m,&wx,&wy,&bx,&by); flag1=flag2=flag3=flag4=false; step1(); if(flag1){ printf("-1\n"); continue; } step2(); step3(); } return 0; }
小结:
简洁分类,转化简并。