Skip to content

Commit 730384f

Browse files
committed
feat: add solutions to lc problem: No.1240
No.1240.Tiling a Rectangle with the Fewest Squares
1 parent a094026 commit 730384f

File tree

4 files changed

+152
-4
lines changed

4 files changed

+152
-4
lines changed

solution/1200-1299/1240.Tiling a Rectangle with the Fewest Squares/README.md

+53-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959

6060
我们可以按位置进行递归回溯。如果当前位置 $(i, j)$ 已经被填充,则直接递归到下一个位置 $(i, j + 1)$。否则,我们枚举当前位置 $(i, j)$ 可以填充的最大正方形的边长 $w$,并将当前位置 $(i, j)$ 到 $(i + w - 1, j + w - 1)$ 的位置全部填充,然后递归到下一个位置 $(i, j + w)$。在回溯时,我们需要将当前位置 $(i, j)$ 到 $(i + w - 1, j + w - 1)$ 的位置全部清空。
6161

62-
由于每个位置只有两种状态:填充或者未填充,因此我们可以使用一个整数来表示当前位置的状态。我们使用一个长度为 $n$ 的整数数组 `filled`,其中 `filled[i]` 表示第 $i$ 行的状态。如果 `filled[i]` 的第 $j$ 位为 $1$,则表示第 $i$ 行第 $j$ 列已经被填充,否则表示未填充。
62+
由于每个位置只有两种状态:填充或者未填充,因此我们可以使用一个整数来表示当前位置的状态。我们使用一个长度为 $n$ 的整数数组 $filled$,其中 $filled[i]$ 表示第 $i$ 行的状态。如果 $filled[i]$ 的第 $j$ 位为 $1$,则表示第 $i$ 行第 $j$ 列已经被填充,否则表示未填充。
6363

6464
<!-- tabs:start -->
6565

@@ -70,7 +70,7 @@
7070
```python
7171
class Solution:
7272
def tilingRectangle(self, n: int, m: int) -> int:
73-
def dfs(i, j, t):
73+
def dfs(i: int, j: int, t: int):
7474
nonlocal ans
7575
if j == m:
7676
i += 1
@@ -290,6 +290,57 @@ func min(a, b int) int {
290290
}
291291
```
292292

293+
### **TypeScript**
294+
295+
```ts
296+
function tilingRectangle(n: number, m: number): number {
297+
let ans = n * m;
298+
const filled: number[] = new Array(n).fill(0);
299+
const dfs = (i: number, j: number, t: number) => {
300+
if (j === m) {
301+
++i;
302+
j = 0;
303+
}
304+
if (i === n) {
305+
ans = t;
306+
return;
307+
}
308+
if ((filled[i] >> j) & 1) {
309+
dfs(i, j + 1, t);
310+
} else if (t + 1 < ans) {
311+
let [r, c] = [0, 0];
312+
for (let k = i; k < n; ++k) {
313+
if ((filled[k] >> j) & 1) {
314+
break;
315+
}
316+
++r;
317+
}
318+
for (let k = j; k < m; ++k) {
319+
if ((filled[i] >> k) & 1) {
320+
break;
321+
}
322+
++c;
323+
}
324+
const mx = Math.min(r, c);
325+
for (let w = 1; w <= mx; ++w) {
326+
for (let k = 0; k < w; ++k) {
327+
filled[i + w - 1] |= 1 << (j + k);
328+
filled[i + k] |= 1 << (j + w - 1);
329+
}
330+
dfs(i, j + w, t + 1);
331+
}
332+
for (let x = i; x < i + mx; ++x) {
333+
for (let y = j; y < j + mx; ++y) {
334+
filled[x] ^= 1 << y;
335+
}
336+
}
337+
}
338+
};
339+
dfs(0, 0, 0);
340+
return ans;
341+
}
342+
```
343+
293344
### **...**
294345

295346
```

solution/1200-1299/1240.Tiling a Rectangle with the Fewest Squares/README_EN.md

+52-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
```python
5353
class Solution:
5454
def tilingRectangle(self, n: int, m: int) -> int:
55-
def dfs(i, j, t):
55+
def dfs(i: int, j: int, t: int):
5656
nonlocal ans
5757
if j == m:
5858
i += 1
@@ -270,6 +270,57 @@ func min(a, b int) int {
270270
}
271271
```
272272

273+
### **TypeScript**
274+
275+
```ts
276+
function tilingRectangle(n: number, m: number): number {
277+
let ans = n * m;
278+
const filled: number[] = new Array(n).fill(0);
279+
const dfs = (i: number, j: number, t: number) => {
280+
if (j === m) {
281+
++i;
282+
j = 0;
283+
}
284+
if (i === n) {
285+
ans = t;
286+
return;
287+
}
288+
if ((filled[i] >> j) & 1) {
289+
dfs(i, j + 1, t);
290+
} else if (t + 1 < ans) {
291+
let [r, c] = [0, 0];
292+
for (let k = i; k < n; ++k) {
293+
if ((filled[k] >> j) & 1) {
294+
break;
295+
}
296+
++r;
297+
}
298+
for (let k = j; k < m; ++k) {
299+
if ((filled[i] >> k) & 1) {
300+
break;
301+
}
302+
++c;
303+
}
304+
const mx = Math.min(r, c);
305+
for (let w = 1; w <= mx; ++w) {
306+
for (let k = 0; k < w; ++k) {
307+
filled[i + w - 1] |= 1 << (j + k);
308+
filled[i + k] |= 1 << (j + w - 1);
309+
}
310+
dfs(i, j + w, t + 1);
311+
}
312+
for (let x = i; x < i + mx; ++x) {
313+
for (let y = j; y < j + mx; ++y) {
314+
filled[x] ^= 1 << y;
315+
}
316+
}
317+
}
318+
};
319+
dfs(0, 0, 0);
320+
return ans;
321+
}
322+
```
323+
273324
### **...**
274325

275326
```

solution/1200-1299/1240.Tiling a Rectangle with the Fewest Squares/Solution.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
class Solution:
22
def tilingRectangle(self, n: int, m: int) -> int:
3-
def dfs(i, j, t):
3+
def dfs(i: int, j: int, t: int):
44
nonlocal ans
55
if j == m:
66
i += 1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
function tilingRectangle(n: number, m: number): number {
2+
let ans = n * m;
3+
const filled: number[] = new Array(n).fill(0);
4+
const dfs = (i: number, j: number, t: number) => {
5+
if (j === m) {
6+
++i;
7+
j = 0;
8+
}
9+
if (i === n) {
10+
ans = t;
11+
return;
12+
}
13+
if ((filled[i] >> j) & 1) {
14+
dfs(i, j + 1, t);
15+
} else if (t + 1 < ans) {
16+
let [r, c] = [0, 0];
17+
for (let k = i; k < n; ++k) {
18+
if ((filled[k] >> j) & 1) {
19+
break;
20+
}
21+
++r;
22+
}
23+
for (let k = j; k < m; ++k) {
24+
if ((filled[i] >> k) & 1) {
25+
break;
26+
}
27+
++c;
28+
}
29+
const mx = Math.min(r, c);
30+
for (let w = 1; w <= mx; ++w) {
31+
for (let k = 0; k < w; ++k) {
32+
filled[i + w - 1] |= 1 << (j + k);
33+
filled[i + k] |= 1 << (j + w - 1);
34+
}
35+
dfs(i, j + w, t + 1);
36+
}
37+
for (let x = i; x < i + mx; ++x) {
38+
for (let y = j; y < j + mx; ++y) {
39+
filled[x] ^= 1 << y;
40+
}
41+
}
42+
}
43+
};
44+
dfs(0, 0, 0);
45+
return ans;
46+
}

0 commit comments

Comments
 (0)