16 个长方形 ,12小4大(16进制表示:0-B# 规格:1*2;C-F# 规格:1*3)放入 6*6的正方形内,有多少种放法,列印出来?
如:
001122
334455
667788
99AABB
CCCDDD
EEEFFF
输出:001122,334455,667788,99AABB,CCCDDD,EEEFFF
012345
012345
CCCDDD
EF6677
EF88AB
EF99AB输出:012345,012345,CCCDDD,EF6677,EF88AB,EF99AB
熟悉华容道算法的朋友自然小菜一碟
如:
001122
334455
667788
99AABB
CCCDDD
EEEFFF
输出:001122,334455,667788,99AABB,CCCDDD,EEEFFF
012345
012345
CCCDDD
EF6677
EF88AB
EF99AB输出:012345,012345,CCCDDD,EF6677,EF88AB,EF99AB
熟悉华容道算法的朋友自然小菜一碟
解决方案 »
- VB6.0 关于数据库的问题!!!!!!!
- 请教: 关于Excel的“错误检查”
- 请问:如何把MSHFlexGrid里的数据保存到SQL数据库中
- 如何传递窗体中的一个数组给另一个窗体,并让另一个窗体使用?
- 请教一个connection的问题
- 怎样把当前时间格式化为字符传?要这种类型的 “2004-10-02 02:25:53”,马上给分
- 各位大虾,我想用reocrdset.addnew方法,请指教
- 怎样导入一个已有的注册表文件
- 根据上周我们讨论的窗体类的缺省实例Form1的表现来推测
- 为什么我在DataGrid1_Click()里检测到的DataGrid1.Text值是上次单击时的值?
- 文件读写的问题,请教!
- 带有汉字的字符串读写问题
长方形有两种:1*2(A), 1*3(B)。欲放入 6*6 正方形中。A 至多可用 12 个,B 至多可用 4 个。
把大小长方形命令并求其具体位置并没有意义。如果一定要,可在上题解出后,求大小长方形的数学排列。
Option Explicit
Private fk(5, 5) As Byte
Private Sub Form_Load()
Call pl(0)
End SubPrivate Sub pl(cfx As Byte)Dim i As Byte
Dim j As Byte
Dim i1 As Byte
Dim j1 As Byte
Dim b As String
Dim fk2(5, 5) As Byte'用循环扫描长方形起始点全部情况,然后向右和下分别作长方形For i1 = 0 To 5
For j1 = 0 To 5
fk2(i1, j1) = fk(i1, j1)
Next
NextFor i = 0 To 5
For j = 0 To 5
If cfx = 0 Then
For i1 = 0 To 5
For j1 = 0 To 5
fk2(i1, j1) = 16 '先把方块的初始值设为16
Next
Next
End If
For i1 = 0 To 5
For j1 = 0 To 5
fk(i1, j1) = fk2(i1, j1)
Next
Next
If cfx >= 0 And cfx <= 11 Then '0-B# 规格:1*2
If i + 1 <= 5 Then '向右作长方形
If fk(i, j) = 16 And fk(i + 1, j) = 16 Then
fk(i, j) = cfx
fk(i + 1, j) = cfx
Call pl(cfx + 1)
End If
End If
If j + 1 <= 5 Then '向下作长方形
If fk(i, j) = 16 And fk(i, j + 1) = 16 Then
fk(i, j) = cfx
fk(i, j + 1) = cfx
Call pl(cfx + 1)
End If
End If
Else 'C-F# 规格:1*3
If i + 2 <= 5 Then '向右作长方形
If fk(i, j) = 16 And fk(i + 1, j) = 16 And fk(i + 2, j) = 16 Then
fk(i, j) = cfx
fk(i + 1, j) = cfx
fk(i + 2, j) = cfx
If cfx <> 15 Then
Call pl(cfx + 1)
Else
b = ""
For j1 = 0 To 5
For i1 = 0 To 5
b = b & Hex(fk(i1, j1))
Next
If j1 <> 5 Then b = b & ","
Next
Debug.Print b
End If
End If
End If
If j + 2 <= 5 Then '向下作长方形
If fk(i, j) = 16 And fk(i, j + 1) = 16 And fk(i, j + 2) = 16 Then
fk(i, j) = cfx
fk(i, j + 1) = cfx
fk(i, j + 2) = cfx
If cfx <> 15 Then
Call pl(cfx + 1)
Else
b = ""
For j1 = 0 To 5
For i1 = 0 To 5
b = b & Hex(fk(i1, j1))
Next
If j1 <> 5 Then b = b & ","
Next
Debug.Print b
End If
End If
End If
End If
Next
NextEnd Sub
发现带“.:RNPA:.”标志的都是高手。
Dim i As Long, j As Long
Dim s As String
For i = 0 To 5
For j = 0 To 5
s = s & Hex(Matrix(i, j) - 1)
Next j
s = s & vbCrLf
Next i
Text1.Text = Text1.Text & vbCrLf & s
C = C + 1
End SubSub Recursion(Matrix() As Long, s As Long)
Dim SfMatrix(0 To 5, 0 To 5) As Long
Dim i As Long, j As Long
For i = 0 To 5
For j = 0 To 5
SfMatrix(i, j) = Matrix(i, j)
Next j
Next i
If s <= 12 Then
For i = 0 To 5
For j = 0 To 5
If SfMatrix(i, j) = 0 Then
If j < 5 Then
If SfMatrix(i, j + 1) = 0 Then
SfMatrix(i, j) = s
SfMatrix(i, j + 1) = s
Recursion SfMatrix, s + 1
SfMatrix(i, j) = 0
SfMatrix(i, j + 1) = 0
End If
End If
If i < 5 Then
If SfMatrix(i + 1, j) = 0 Then
SfMatrix(i, j) = s
SfMatrix(i + 1, j) = s
Recursion SfMatrix, s + 1
SfMatrix(i, j) = 0
SfMatrix(i + 1, j) = 0
End If
End If
End If
Next j
Next i
ElseIf s <= 16 Then
For i = 0 To 5
For j = 0 To 5
If SfMatrix(i, j) = 0 Then
If j < 4 Then
If SfMatrix(i, j + 1) = 0 And SfMatrix(i, j + 2) = 0 Then
SfMatrix(i, j) = s
SfMatrix(i, j + 1) = s
SfMatrix(i, j + 2) = s
Recursion SfMatrix, s + 1
SfMatrix(i, j) = 0
SfMatrix(i, j + 1) = 0
SfMatrix(i, j + 2) = 0
End If
End If
If i < 4 Then
If SfMatrix(i + 1, j) = 0 And SfMatrix(i + 2, j) = 0 Then
SfMatrix(i, j) = s
SfMatrix(i + 1, j) = s
SfMatrix(i + 2, j) = s
Recursion SfMatrix, s + 1
SfMatrix(i, j) = 0
SfMatrix(i + 1, j) = 0
SfMatrix(i + 2, j) = 0
End If
End If
End If
Next j
Next i
Else
PrintOut SfMatrix
End If
End Sub解的数量大得惊人。
本来不应该用递归的,太深了,有36层,但是约束条件很强,所以用递归解也不为过
觉得有不用递归的简单方法,还没想出来
p.s(给分到马甲)
Sub Recursion(Matrix() As Long, s As Long) 'Matrix代表矩阵情况,s代表方块Index
Dim SfMatrix(0 To 5, 0 To 5) As Long
Dim i As Long, j As Long
'使用0作为还没使用的标志,打印的时候-1即可。
'因为VB不支持数组的ByVal传递,所以只有这样了。
For i = 0 To 5
For j = 0 To 5
SfMatrix(i, j) = Matrix(i, j)
Next j
Next i
If s <= 12 Then '1*2方块
For i = 0 To 5
For j = 0 To 5
If SfMatrix(i, j) = 0 Then
If j < 5 Then
If SfMatrix(i, j + 1) = 0 Then '平放
SfMatrix(i, j) = s
SfMatrix(i, j + 1) = s
Recursion SfMatrix, s + 1 '递归
SfMatrix(i, j) = 0
SfMatrix(i, j + 1) = 0
End If
End If
If i < 5 Then
If SfMatrix(i + 1, j) = 0 Then '竖直
SfMatrix(i, j) = s
SfMatrix(i + 1, j) = s
Recursion SfMatrix, s + 1 '递归
SfMatrix(i, j) = 0
SfMatrix(i + 1, j) = 0
End If
End If
End If
Next j
Next i
ElseIf s <= 16 Then '1*3方块
For i = 0 To 5
For j = 0 To 5
If SfMatrix(i, j) = 0 Then
If j < 4 Then
If SfMatrix(i, j + 1) = 0 And SfMatrix(i, j + 2) = 0 Then '平放
SfMatrix(i, j) = s
SfMatrix(i, j + 1) = s
SfMatrix(i, j + 2) = s
Recursion SfMatrix, s + 1 '递归
SfMatrix(i, j) = 0
SfMatrix(i, j + 1) = 0
SfMatrix(i, j + 2) = 0
End If
End If
If i < 4 Then
If SfMatrix(i + 1, j) = 0 And SfMatrix(i + 2, j) = 0 Then '竖直
SfMatrix(i, j) = s
SfMatrix(i + 1, j) = s
SfMatrix(i + 2, j) = s
Recursion SfMatrix, s + 1 '递归
SfMatrix(i, j) = 0
SfMatrix(i + 1, j) = 0
SfMatrix(i + 2, j) = 0
End If
End If
End If
Next j
Next i
Else
PrintOut SfMatrix '打印输出
End If
End Sub
Dim Matrix(0 To 5, 0 To 5) As Long
Recursion Matrix, 1