[ ext{题目大意}
]
(quad)要求用大小为 (k) 的连通块铺满 (n imes m) 的矩形。
[ ext{思路}
]
(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('
');
}
}
return 0;
}