agc041_c Duomino Quality

agc041_c Duomino Quality

https://atcoder.jp/contests/agc041/tasks/agc041_c

U6tmLt.png

Tutorial

https://img.atcoder.jp/agc041/editorial.pdf

称每行每列的quality为\(Q\)的大小为\(N\)的矩阵为\((N,Q)\).发现假如存在合法的\((A,Q),(B,Q)\),那么一定也存在合法的\((A+B,Q)\).也就是将\(A \times A\)的矩阵放在左上角,\(B \times B\)的矩阵放在右下角即可.

那么考虑用一些较小的矩阵来拼出较大的矩阵来

U6t1Jg.png

\(N=2\)时无解,\(N=3\)时用\((3,1)\)的矩阵,当\(N\ge 4\)时,先不断在右下角放\((4,3)\)的矩阵直到\(4 \le\ N \le 7\),然后再放上\((N,3)\)即可.

Code

#include <cstdio>
#include <iostream>
#define debug(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
inline char nc() {
//	return getchar();
	static char buf[100000],*l=buf,*r=buf;
	return l==r&&(r=(l=buf)+fread(buf,1,100000,stdin),l==r)?EOF:*l++;
}
template<class T> void read(T &x) {
	x=0; int f=1,ch=nc();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=nc();}
	while(ch>='0'&&ch<='9'){x=x*10-'0'+ch;ch=nc();}
	x*=f;
}
const int maxN=1000+5;
int N;
char an[maxN][maxN];
string s[8][8];
void init() {
	s[4][0]="aabc";
	s[4][1]="ddbc";
	s[4][2]="bcaa";
	s[4][3]="bcdd";
	s[5][0]="aabba"; 
	s[5][1]="bcc.a"; 
	s[5][2]="b..cb"; 
	s[5][3]="a..cb"; 
	s[5][4]="abbaa";
	s[6][0]="aabc..";
	s[6][1]="ddbc..";
	s[6][2]="..aabc";
	s[6][3]="..ddbc";
	s[6][4]="bc..aa";
	s[6][5]="bc..dd";
	s[7][0]="aabbcc.";
	s[7][1]="dd.dd.a";
	s[7][2]="..d..da";
	s[7][3]="..d..db";
	s[7][4]="dd.dd.b";
	s[7][5]="..d..dc";
	s[7][6]="..d..dc";
}
void work(int x,int y,int n) {
	for(int i=0;i<n;++i) for(int j=0;j<n;++j) an[x+i][x+j]=s[n][i][j];
}
int main() {
	init();
	read(N);
	if(N==2) puts("-1");
	else if(N==3) {
		puts("aa.");
		puts("..a");
		puts("..a");
	}
	else {
		int n=N;
		for(int i=0;i<n;++i) for(int j=0;j<n;++j) an[i][j]='.';
		while(n>7) work(n-4,n-4,4),n-=4;
		work(0,0,n);
		for(int i=0;i<N;++i) {
			for(int j=0;j<N;++j) printf("%c",an[i][j]);
			printf("\n");
		}
	}
	return 0;
}
posted @ 2020-07-17 20:37  LJZ_C  阅读(80)  评论(0编辑  收藏  举报