Skip to content

Commit 7334f8b

Browse files
committed
feat: add solutions to lc problem: No.1240
No.1240.Tiling a Rectangle with the Fewest Squares
1 parent 950c5b9 commit 7334f8b

File tree

7 files changed

+594
-39
lines changed

7 files changed

+594
-39
lines changed

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

+273
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,46 @@ class Solution:
111111
return ans
112112
```
113113

114+
```python
115+
class Solution:
116+
def tilingRectangle(self, n: int, m: int) -> int:
117+
def dfs(i: int, j: int, t: int):
118+
nonlocal ans
119+
if j == m:
120+
i += 1
121+
j = 0
122+
if i == n:
123+
ans = t
124+
return
125+
if filled[i] >> j & 1:
126+
dfs(i, j + 1, t)
127+
elif t + 1 < ans:
128+
r = c = 0
129+
for k in range(i, n):
130+
if filled[k] >> j & 1:
131+
break
132+
r += 1
133+
for k in range(j, m):
134+
if filled[i] >> k & 1:
135+
break
136+
c += 1
137+
mx = min(r, c)
138+
for x in range(i, i + mx):
139+
for y in range(j, j + mx):
140+
filled[x] |= 1 << y
141+
for w in range(mx, 0, -1):
142+
dfs(i, j + w, t + 1)
143+
for k in range(w):
144+
filled[i + w - 1] ^= 1 << (j + k)
145+
if k < w - 1:
146+
filled[i + k] ^= 1 << (j + w - 1)
147+
148+
ans = n * m
149+
filled = [0] * n
150+
dfs(0, 0, 0)
151+
return ans
152+
```
153+
114154
### **Java**
115155

116156
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -174,6 +214,67 @@ class Solution {
174214
}
175215
```
176216

217+
```java
218+
class Solution {
219+
private int n;
220+
private int m;
221+
private int[] filled;
222+
private int ans;
223+
224+
public int tilingRectangle(int n, int m) {
225+
this.n = n;
226+
this.m = m;
227+
ans = n * m;
228+
filled = new int[n];
229+
dfs(0, 0, 0);
230+
return ans;
231+
}
232+
233+
private void dfs(int i, int j, int t) {
234+
if (j == m) {
235+
++i;
236+
j = 0;
237+
}
238+
if (i == n) {
239+
ans = t;
240+
return;
241+
}
242+
if ((filled[i] >> j & 1) == 1) {
243+
dfs(i, j + 1, t);
244+
} else if (t + 1 < ans) {
245+
int r = 0, c = 0;
246+
for (int k = i; k < n; ++k) {
247+
if ((filled[k] >> j & 1) == 1) {
248+
break;
249+
}
250+
++r;
251+
}
252+
for (int k = j; k < m; ++k) {
253+
if ((filled[i] >> k & 1) == 1) {
254+
break;
255+
}
256+
++c;
257+
}
258+
int mx = Math.min(r, c);
259+
for (int x = i; x < i + mx; ++x) {
260+
for (int y = j; y < j + mx; ++y) {
261+
filled[x] |= 1 << y;
262+
}
263+
}
264+
for (int w = mx; w > 0; --w) {
265+
dfs(i, j + w, t + 1);
266+
for (int k = 0; k < w; ++k) {
267+
filled[i + w - 1] ^= 1 << (j + k);
268+
if (k < w - 1) {
269+
filled[i + k] ^= 1 << (j + w - 1);
270+
}
271+
}
272+
}
273+
}
274+
}
275+
}
276+
```
277+
177278
### **C++**
178279

179280
```cpp
@@ -236,6 +337,68 @@ private:
236337
};
237338
```
238339

340+
```cpp
341+
class Solution {
342+
public:
343+
int tilingRectangle(int n, int m) {
344+
memset(filled, 0, sizeof(filled));
345+
this->n = n;
346+
this->m = m;
347+
ans = n * m;
348+
dfs(0, 0, 0);
349+
return ans;
350+
}
351+
352+
private:
353+
int filled[13];
354+
int n, m;
355+
int ans;
356+
357+
void dfs(int i, int j, int t) {
358+
if (j == m) {
359+
++i;
360+
j = 0;
361+
}
362+
if (i == n) {
363+
ans = t;
364+
return;
365+
}
366+
if (filled[i] >> j & 1) {
367+
dfs(i, j + 1, t);
368+
} else if (t + 1 < ans) {
369+
int r = 0, c = 0;
370+
for (int k = i; k < n; ++k) {
371+
if (filled[k] >> j & 1) {
372+
break;
373+
}
374+
++r;
375+
}
376+
for (int k = j; k < m; ++k) {
377+
if (filled[i] >> k & 1) {
378+
break;
379+
}
380+
++c;
381+
}
382+
int mx = min(r, c);
383+
for (int x = i; x < i + mx; ++x) {
384+
for (int y = j; y < j + mx; ++y) {
385+
filled[x] |= 1 << y;
386+
}
387+
}
388+
for (int w = mx; w; --w) {
389+
dfs(i, j + w, t + 1);
390+
for (int k = 0; k < w; ++k) {
391+
filled[i + w - 1] ^= 1 << (j + k);
392+
if (k < w - 1) {
393+
filled[i + k] ^= 1 << (j + w - 1);
394+
}
395+
}
396+
}
397+
}
398+
}
399+
};
400+
```
401+
239402
### **Go**
240403

241404
```go
@@ -295,6 +458,65 @@ func min(a, b int) int {
295458
}
296459
```
297460

461+
```go
462+
func tilingRectangle(n int, m int) int {
463+
ans := n * m
464+
filled := make([]int, n)
465+
var dfs func(i, j, t int)
466+
dfs = func(i, j, t int) {
467+
if j == m {
468+
i++
469+
j = 0
470+
}
471+
if i == n {
472+
ans = t
473+
return
474+
}
475+
if filled[i]>>j&1 == 1 {
476+
dfs(i, j+1, t)
477+
} else if t+1 < ans {
478+
var r, c int
479+
for k := i; k < n; k++ {
480+
if filled[k]>>j&1 == 1 {
481+
break
482+
}
483+
r++
484+
}
485+
for k := j; k < m; k++ {
486+
if filled[i]>>k&1 == 1 {
487+
break
488+
}
489+
c++
490+
}
491+
mx := min(r, c)
492+
for x := i; x < i+mx; x++ {
493+
for y := j; y < j+mx; y++ {
494+
filled[x] |= 1 << y
495+
}
496+
}
497+
for w := mx; w > 0; w-- {
498+
dfs(i, j+w, t+1)
499+
for k := 0; k < w; k++ {
500+
filled[i+w-1] ^= 1 << (j + k)
501+
if k < w-1 {
502+
filled[i+k] ^= 1 << (j + w - 1)
503+
}
504+
}
505+
}
506+
}
507+
}
508+
dfs(0, 0, 0)
509+
return ans
510+
}
511+
512+
func min(a, b int) int {
513+
if a < b {
514+
return a
515+
}
516+
return b
517+
}
518+
```
519+
298520
### **TypeScript**
299521

300522
```ts
@@ -346,6 +568,57 @@ function tilingRectangle(n: number, m: number): number {
346568
}
347569
```
348570

571+
```ts
572+
function tilingRectangle(n: number, m: number): number {
573+
let ans = n * m;
574+
const filled: number[] = new Array(n).fill(0);
575+
const dfs = (i: number, j: number, t: number) => {
576+
if (j === m) {
577+
++i;
578+
j = 0;
579+
}
580+
if (i === n) {
581+
ans = t;
582+
return;
583+
}
584+
if ((filled[i] >> j) & 1) {
585+
dfs(i, j + 1, t);
586+
} else if (t + 1 < ans) {
587+
let [r, c] = [0, 0];
588+
for (let k = i; k < n; ++k) {
589+
if ((filled[k] >> j) & 1) {
590+
break;
591+
}
592+
++r;
593+
}
594+
for (let k = j; k < m; ++k) {
595+
if ((filled[i] >> k) & 1) {
596+
break;
597+
}
598+
++c;
599+
}
600+
const mx = Math.min(r, c);
601+
for (let x = i; x < i + mx; ++x) {
602+
for (let y = j; y < j + mx; ++y) {
603+
filled[x] |= 1 << y;
604+
}
605+
}
606+
for (let w = mx; w > 0; --w) {
607+
dfs(i, j + w, t + 1);
608+
for (let k = 0; k < w; ++k) {
609+
filled[i + w - 1] ^= 1 << (j + k);
610+
if (k < w - 1) {
611+
filled[i + k] ^= 1 << (j + w - 1);
612+
}
613+
}
614+
}
615+
}
616+
};
617+
dfs(0, 0, 0);
618+
return ans;
619+
}
620+
```
621+
349622
### **...**
350623

351624
```

0 commit comments

Comments
 (0)