agc041_c Duomino Quality
https://atcoder.jp/contests/agc041/tasks/agc041_c
Tutorial
https://img.atcoder.jp/agc041/editorial.pdf
称每行每列的quality为(Q)的大小为(N)的矩阵为((N,Q)).发现假如存在合法的((A,Q),(B,Q)),那么一定也存在合法的((A+B,Q)).也就是将(A imes A)的矩阵放在左上角,(B imes B)的矩阵放在右下角即可.
那么考虑用一些较小的矩阵来拼出较大的矩阵来
(N=2)时无解,(N=3)时用((3,1))的矩阵,当(Nge 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("
");
}
}
return 0;
}