套路的拆分信息,注意到如果一个 和一个 的合法构造每一行上的骨牌数相同,则可以一个放在左上角一个放在右下角合并成一个新的骨牌数不变的 的合法构造。打个表发现 都可以构造出每一行每一列都是 个骨牌覆盖的合法构造,然后直接用 矩阵作为基底构造,剩下的边界情况用另外三个矩阵覆盖一下即可。需要特判 无解, 搜出来一个构造即可。
代码特别好吃。
namespace lowspeed_song {
mt19937_64 mt(time(0));
inline void init() {
}
inline void sol([[maybe_unused]]int __testcase_id, [[maybe_unused]]int __testcase_sum) {
int n; cin >> n;
if (n == 2) cout << -1 << '\n';
else if (n == 3) {
cout << "a..\n";
cout << "a..\n";
cout << ".bb\n";
} else if (n == 4) {
cout << "aabc\n";
cout << "ddbc\n";
cout << "efgg\n";
cout << "efhh\n";
} else if (n == 5) {
cout << "aabcc\n";
cout << "ddb.e\n";
cout << "ffgge\n";
cout << "..hij\n";
cout << "..hij\n";
} else if (n == 6) {
cout << "ab.c..\n";
cout << "ab.c..\n";
cout << "d.e.ff\n";
cout << "d.eg..\n";
cout << ".hhgii\n";
cout << "jjkkll\n";
} else if (n == 7) {
cout << "a.bbcc.\n";
cout << "add...e\n";
cout << "..f.gge\n";
cout << "hhf...i\n";
cout << ".j.k..i\n";
cout << "lj.k...\n";
cout << "l..mmnn\n";
} else {
if (n % 4 == 0) {
for (int i = 0; i < n / 4; ++i, cout << '\n') {
for (int j = 0; j < i; ++j) cout << "....";
cout << "aabc";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << '\n';
for (int j = 0; j < i; ++j) cout << "....";
cout << "ddbc";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << '\n';
for (int j = 0; j < i; ++j) cout << "....";
cout << "efgg";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << '\n';
for (int j = 0; j < i; ++j) cout << "....";
cout << "efhh";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
}
} else if (n % 4 == 1) {
for (int i = 0; i < n / 4 - 1; ++i, cout << '\n') {
for (int j = 0; j < i; ++j) cout << "....";
cout << "aabc";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << ".";
cout << '\n';
for (int j = 0; j < i; ++j) cout << "....";
cout << "ddbc";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << ".";
cout << '\n';
for (int j = 0; j < i; ++j) cout << "....";
cout << "efgg";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << ".";
cout << '\n';
for (int j = 0; j < i; ++j) cout << "....";
cout << "efhh";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << ".";
} for (int j = 0; j < n - 5; ++j) cout << ".";
cout << "aabcc\n";
for (int j = 0; j < n - 5; ++j) cout << ".";
cout << "ddb.e\n";
for (int j = 0; j < n - 5; ++j) cout << ".";
cout << "ffgge\n";
for (int j = 0; j < n - 5; ++j) cout << ".";
cout << "..hij\n";
for (int j = 0; j < n - 5; ++j) cout << ".";
cout << "..hij\n";
} else if (n % 4 == 2) {
for (int i = 0; i < n / 4 - 1; ++i, cout << '\n') {
for (int j = 0; j < i; ++j) cout << "....";
cout << "aabc";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << "..";
cout << '\n';
for (int j = 0; j < i; ++j) cout << "....";
cout << "ddbc";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << "..";
cout << '\n';
for (int j = 0; j < i; ++j) cout << "....";
cout << "efgg";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << "..";
cout << '\n';
for (int j = 0; j < i; ++j) cout << "....";
cout << "efhh";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << "..";
} for (int j = 0; j < n - 6; ++j) cout << ".";
cout << "ab.c..\n";
for (int j = 0; j < n - 6; ++j) cout << ".";
cout << "ab.c..\n";
for (int j = 0; j < n - 6; ++j) cout << ".";
cout << "d.e.ff\n";
for (int j = 0; j < n - 6; ++j) cout << ".";
cout << "d.eg..\n";
for (int j = 0; j < n - 6; ++j) cout << ".";
cout << ".hhgii\n";
for (int j = 0; j < n - 6; ++j) cout << ".";
cout << "jjkkll\n";
} else {
for (int i = 0; i < n / 4 - 1; ++i, cout << '\n') {
for (int j = 0; j < i; ++j) cout << "....";
cout << "aabc";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << "...";
cout << '\n';
for (int j = 0; j < i; ++j) cout << "....";
cout << "ddbc";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << "...";
cout << '\n';
for (int j = 0; j < i; ++j) cout << "....";
cout << "efgg";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << "...";
cout << '\n';
for (int j = 0; j < i; ++j) cout << "....";
cout << "efhh";
for (int j = i; j < n / 4 - 1; ++j) cout << "....";
cout << "...";
} for (int j = 0; j < n - 7; ++j) cout << ".";
cout << "a.bbcc.\n";
for (int j = 0; j < n - 7; ++j) cout << ".";
cout << "add...e\n";
for (int j = 0; j < n - 7; ++j) cout << ".";
cout << "..f.gge\n";
for (int j = 0; j < n - 7; ++j) cout << ".";
cout << "hhf...i\n";
for (int j = 0; j < n - 7; ++j) cout << ".";
cout << ".j.k..i\n";
for (int j = 0; j < n - 7; ++j) cout << ".";
cout << "lj.k...\n";
for (int j = 0; j < n - 7; ++j) cout << ".";
cout << "l..mmnn\n";
}
}
}
} // namespace lowspeed_song
喜欢的话,留下你的评论吧~