洛谷 P1228 地毯填补问题 题解

洛谷 P1228 地毯填补问题 题解

题目大意

原题链接:P1228 地毯填补问题 - 洛谷

有一个边长为 \(2^k\) 的正方形,公主站在其中一个方格里,要求用如图所示的若干个 L 形地毯铺满整个大正方形(除了公主的位置)

四种 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;
}
posted @ 2026-08-16 12:33  zzx321  阅读(7)  评论(0)    收藏  举报