|
我也写了个通用的递归算法代码:
未使用排除法剪枝,但也不是简单的递归遍历。
算法如下:
1. 端点采用遍历的方法。(仅限制为<和值一半)
2. 中间点无需循环遍历,可以直接计算,然后验证是否有效即可(>0以及不重复)
输出结果时,统一转化结果为以1为首字符的字符串。
- Dim a&(), b&(), h&, k&, m&, m2&, s$, cnt&
- Sub test() 'by kagawa 2018/6/7
- ' m = 4 '端点个数m
- ' h = 12 '各边总和h
-
- m = 5 '端点个数m
- h = 14 '各边总和h
-
- m2 = m * 2 '数字总数
- ReDim a&(m2), b&(h - 3)
- s = String(m2, "0")
- cnt = 0: Call dg(1)
- Debug.Print cnt '176
- End Sub
- Sub dg(t&)
- Dim i&, j&, s2$, s3$
- cnt = cnt + 1
-
- If t = m2 + 1 Then
- k = k + 1
- i = InStr(s, 1)
- s2 = Mid(s, i) & Left(s, i - 1) '以1为首位的字符串结果
- s3 = 1 & Left(StrReverse(s2), m2 - 1) '反向然后以1为首位
- If s2 < s3 Then Debug.Print s, s2, s3 Else Debug.Print s, s3, s2
- Exit Sub
- End If
-
- If t <= m Then '端点
- For i = 1 To h / 2 '遍历检查
- If b(i) = 0 Then '如果未重复
- Mid(s, t * 2 - 1, 1) = i
- a(t) = i: b(i) = 1
- Call dg(t + 1)
- a(t) = 0: b(i) = 0
- End If
- Next
- Else '中间点时 计算得到数值
- If t = m2 Then
- i = h - a(t - m) - a(1)
- Else
- i = h - a(t - m) - a(t - m + 1)
- End If
- If i > 0 Then '如果计算数非负数则有效
- If b(i) = 0 Then '如果未重复
- If i > 9 Then s2 = Chr(i + 55) Else s2 = i '数值>9时转为字母
- Mid(s, (t - m) * 2, 1) = s2
- a(t) = i: b(i) = 1
- Call dg(t + 1)
- a(t) = 0: b(i) = 0
- End If
- End If
- End If
- End Sub
复制代码 |
评分
-
1
查看全部评分
-
|