洛谷 P1228 地毯填补问题 题解
洛谷 P1228 地毯填补问题 题解
题目大意
原题链接:P1228 地毯填补问题 - 洛谷
有一个边长为 \(2^k\) 的正方形,公主站在其中一个方格里,要求用如图所示的若干个 L 形地毯铺满整个大正方形(除了公主的位置)

题目分析
先考虑最简单的情况。当迷宫大小为 \(2\times 2\) 时,不管公主站在哪里,都可以只用一块地毯铺好。
再考虑大小为 \(4\times 4\) 时,可以将迷宫划分为 \(4\) 个 \(2\times 2\) 的小迷宫,公主肯定站在其中一个小迷宫里。那么只要在大迷宫的正中央铺一块地毯,将除公主站着的三个小迷宫全部覆盖到,再将地毯覆盖的格子看作公主所在的格子,给每个小迷宫铺地毯。
代码实现
使用递归函数实现,具体代码如下:
#include <cstdio>
int k, x, y;
int a[1100][1100];
void f(int x, int y, int gx, int gy, int k) { // x,y为迷宫左上角坐标,gx,gy为公主坐标
if (k == 1) {
if (gx == x && gy == y) {
printf("%d %d 1\n", x + 1, y + 1);
} else if (gx == x && gy == y + 1) {
printf("%d %d 2\n", x + 1, y);
} else if (gx == x + 1 && gy == y) {
printf("%d %d 3\n", x, y + 1);
} else {
printf("%d %d 4\n", x, y);
}
return;
}
int tx = x + (1 << (k - 1)) - 1, ty = y + (1 << (k - 1)) - 1;
// 使用位运算,提高运算速度,相当于2^(k-1)
if (gx <= tx && gy <= ty) {
printf("%d %d 1\n", tx + 1, ty + 1);
f(x, y, gx, gy, k - 1);
f(x, ty + 1, tx, ty + 1, k - 1);
f(tx + 1, y, tx + 1, ty, k - 1);
f(tx + 1, ty + 1, tx + 1, ty + 1, k - 1);
} else if (gx <= tx && gy > y) {
printf("%d %d 2\n", tx + 1, ty);
f(x, y, tx, ty, k - 1);
f(x, ty + 1, gx, gy, k - 1);
f(tx + 1, y, tx + 1, ty, k - 1);
f(tx + 1, ty + 1, tx + 1, ty + 1, k - 1);
} else if (gx > tx && gy <= y) {
printf("%d %d 3\n", tx, ty + 1);
f(x, y, tx, ty, k - 1);
f(x, ty + 1, tx, ty + 1, k - 1);
f(tx + 1, y, gx, gy, k - 1);
f(tx + 1, ty + 1, tx + 1, ty + 1, k - 1);
} else {
printf("%d %d 4\n", tx, ty);
f(x, y, tx, ty, k - 1);
f(x, ty + 1, tx, ty + 1, k - 1);
f(tx + 1, y, tx + 1, ty, k - 1);
f(tx + 1, ty + 1, gx, gy, k - 1);
}
}
int main() {
scanf("%d%d%d", &k, &x, &y);
f(1, 1, x, y, k);
return 0;
}

浙公网安备 33010602011771号