题解 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;
}
posted @ 2021-10-25 21:07  Farkas_W  阅读(54)  评论(0编辑  收藏  举报