1. 程式人生 > 其它 >題解 P7886 「MCOI-06」Gerrymandering

題解 P7886 「MCOI-06」Gerrymandering

\[\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;
}