|
|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 yynrzwh 于 2025-8-12 22:15 编辑
仅算6*10,并取1个路径
例如:[1,1][2,1][5,1][8,2][7,1][6,4][10,4][11,2][3,3][9,4][4,3][12,4]
[1,1]中,前面的1表示第一种图形,后面的1表示第一种旋转方式。
十二块凑长方形.7z
(25.21 KB, 下载次数: 9)
- Dim n&, ar, spath$, rol&
- Sub test2()
- n = 12
- ReDim ar(1 To n, 1 To 4)
- getblock ar
- ReDim res(1 To 6, 1 To 10) As Integer '6*10
- ReDim u(1 To n) As Boolean
- spath = "": rol = 0
- dfs res, u, "", False
- MsgBox spath
- End Sub
- Private Sub dfs(res, u, ss, flag)
- pos = getpos(res)
- x = pos(0): y = pos(1)
- If x = 0 Then
- ' rol = rol + 1
- ' Cells(rol, "w") = ss
- spath = ss
- flag = True
- Exit Sub
- End If
- For i = 1 To n
- If Not u(i) Then
- For j = 1 To 4
- b = ar(i, j)
- If IsArray(b) Then
- tem = res
- If istrue(x, y, b, tem) Then
- u(i) = True
- dfs tem, u, ss & "[" & i & "," & j & "]", flag
- If flag Then Exit Sub
- u(i) = False
- End If
- End If
- Next
- End If
- Next
- End Sub
- Private Function istrue(x, y, b, tem) As Boolean
- Dim r&, c&, k&
- For i = 1 To UBound(b, 2)
- If b(1, i) = 1 Then Exit For
- k = k + 1
- Next
- si = x
- sj = y - k
- m1 = x + UBound(b) - 1
- m2 = y + UBound(b, 2) - 1 - k
- If m1 > UBound(tem) Or m2 > UBound(tem, 2) Or sj < 1 Then Exit Function
- For i = si To m1
- r = r + 1: c = 0
- For j = sj To m2
- c = c + 1
- tem(i, j) = tem(i, j) + b(r, c)
- If tem(i, j) > 1 Then Exit Function
- Next
- Next
- istrue = True
- End Function
- Private Function getpos(br)
- For i = 1 To UBound(br)
- For j = 1 To UBound(br, 2)
- If br(i, j) = 0 Then
- getpos = Array(i, j)
- Exit Function
- End If
- Next
- Next
- getpos = Array(0, 0)
- End Function
- Private Sub getblock(ar)
- For i = 1 To 49
- If Cells(i, 1) <> "" Then
- r = r + 1: c = 0
- For j = 3 To 20
- If Cells(i, j) <> "" And Cells(i, j - 1) = "" Then
- c = c + 1
- ar(r, c) = Cells(i, j).CurrentRegion
- End If
- Next
- End If
- Next
- End Sub
复制代码
|
|