1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
func min(a, b int) int {
if a < b {
return a
}
return b
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func tilingRectangle(n int, m int) int {
ans := max(n, m)
rect := make([][]bool, n)
for i := 0; i < n; i++ {
rect[i] = make([]bool, m)
}
isAvailable := func(x, y, k int) bool {
for i := 0; i < k; i++ {
for j := 0; j < k; j++ {
if rect[x + i][y + j] {
return false
}
}
}
return true
}
fillUp := func(x, y, k int, val bool) {
for i := 0; i < k; i++ {
for j := 0; j < k; j++ {
rect[x + i][y + j] = val
}
}
}
var dfs func(int, int, int)
dfs = func(x, y, cnt int) {
if cnt >= ans {
return
}
if x >= n {
ans = cnt
return
}
// 检测下一行
if y >= m {
dfs(x + 1, 0, cnt)
return
}
// 如当前已经被覆盖,则直接尝试下一个位置
if rect[x][y] {
dfs(x, y + 1, cnt)
return
}
for k := min(n - x, m - y); k >= 1 && isAvailable(x, y, k); k-- {
// 将长度为 k 的正方形区域标记覆盖
fillUp(x, y, k, true)
// 跳过 k 个位置开始检测
dfs(x, y + k, cnt + 1)
fillUp(x, y, k, false)
}
}
dfs(0, 0, 0)
return ans
}
|