題解 P7886 「MCOI-06」Gerrymandering
阿新 • • 發佈:2021-10-25
\[\text{題目大意}
\]
\(\quad\)要求用大小為 \(k\) 的連通塊鋪滿 \(n\times m\) 的矩形。
\[\text{思路} \]\(\quad\)這是一道構造題,一開始我的想法是dfs,優先走邊界,就是走螺旋形,雖然過了此題,但還是花了不少時間。
\(\quad\)現在一看,直接走蛇形不就好了嗎?
\(\quad\)這樣只需要根據行的奇偶性,判斷從左開始還是從右開始鋪即可。
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #define re register int #define il inline using namespace std; il int read() { int x=0,f=1;char ch=getchar(); while(!isdigit(ch)&&ch!='-')ch=getchar(); if(ch=='-')f=-1,ch=getchar(); while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); return x*f; } il void print(int x) { if(x<0)putchar('-'),x=-x; if(x/10)print(x/10); putchar(x%10+'0'); } const int N=1e6+5; int T,n,m,k,a[N],cnt,num; signed main() { T=read(); while(T--){ n=read();m=read();k=read(); if(n*m%k){puts("NO");continue;} cnt=1;num=0;puts("YES"); for(re i=1;i<=n;i++) { if(i&1){ for(re j=1;j<=m;j++) { if(num==k)num=0,cnt++; a[j]=cnt;num++; } } else { for(re j=m;j>=1;j--) { if(num==k)num=0,cnt++; a[j]=cnt;num++; } } for(re j=1;j<=m;j++)print(a[j]),putchar(' '); putchar('\n'); } } return 0; }