LeetCode //C - 1240. Tiling a Rectangle with the Fewest Squares

1240. Tiling a Rectangle with the Fewest Squares

Given a rectangle of size n x m, return the minimum number of integer-sided squares that tile the rectangle.

Example 1:

Input: n = 2, m = 3

Output: 3

Explanation: 3 squares are necessary to cover the rectangle.

2 (squares of 1x1)

1 (square of 2x2)

Example 2:

Input: n = 5, m = 8

Output: 5

Example 3:

Input: n = 11, m = 13

Output: 6

Constraints:
  • 1 <= n, m <= 13

From: LeetCode

Link: 1240. Tiling a Rectangle with the Fewest Squares


Solution:

Ideas:

use backtracking with a "height array". Always fill the lowest column first, try the biggest possible square first, and prune when already worse than answer.

Code:
c 复制代码
int H, W;
int best;
int height[13];

void dfs(int used) {
    if (used >= best) return;

    int minH = H, pos = -1;

    for (int i = 0; i < W; i++) {
        if (height[i] < minH) {
            minH = height[i];
            pos = i;
        }
    }

    if (minH == H) {
        best = used;
        return;
    }

    int maxSize = H - minH;

    for (int i = pos; i < W && height[i] == minH; i++) {
        int width = i - pos + 1;
        if (width > maxSize) break;
    }

    int len = 0;
    while (pos + len < W && height[pos + len] == minH && len < maxSize) {
        len++;
    }

    for (int size = len; size >= 1; size--) {
        for (int i = pos; i < pos + size; i++) {
            height[i] += size;
        }

        dfs(used + 1);

        for (int i = pos; i < pos + size; i++) {
            height[i] -= size;
        }
    }
}

int tilingRectangle(int n, int m) {
    H = n;
    W = m;

    if (H < W) {
        int temp = H;
        H = W;
        W = temp;
    }

    best = H * W;

    for (int i = 0; i < W; i++) {
        height[i] = 0;
    }

    dfs(0);

    return best;
}
相关推荐
稻米哟1 小时前
力扣100——双指针
算法·leetcode
码行山野赴时序归途1 小时前
C语言预处理指令:编译前的“幕后导演“
c语言·开发语言
明志数科2 小时前
具身智能真机采集工程实践:5类高频失效模式与规避清单
人工智能·算法·机器学习
CSDN_RTKLIB2 小时前
空间哈希与拓扑缓存
算法
大熊背4 小时前
IspPipeline色相旋转模块实现
人工智能·算法·计算机视觉
爱学习的小白柏4 小时前
同城双活的核心不是双活,是逼着数据别出机房
大数据·人工智能·算法·langchain·ai编程
鹿角片ljp4 小时前
LeetCode 31:下一个排列|右找小,右找大,交换,右反转
java·数据结构·算法
2401_858286114 小时前
130.【C语言】可变参数宏
c语言·开发语言
彧azz5 小时前
B树原理与C语言实现
c语言·数据结构·b树