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;
}
相关推荐
左手の明天5 小时前
SLIP 协议封装与解析详解:原理、C 代码与实战案例
linux·c语言·开发语言·c++
海上小飞龙5 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
青少儿编程课堂5 小时前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
朝朝辞暮i5 小时前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
小灰灰搞电子6 小时前
C语言 <ctype.h> 头文件详解
c语言·ctype.h
乐迪信息7 小时前
港口船舶逆行怎么管?AI防爆摄像机搭载智能检测算法
大数据·人工智能·深度学习·算法·计算机视觉
阿钱真强道7 小时前
17 嵌入式操作系统 | uloop 事件循环:TCP 客户端
c语言·tcp/ip·tcp·事件循环·uloop
Sirens.7 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕8 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
tangguofeng8 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法