题解 P7886 「MCOI-06」Gerrymandering

[ 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;
}
原文地址:https://www.cnblogs.com/FarkasW/p/15463180.html