|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
Option Explicit
'6+4=4
'答案1,0+4=4
'答案2,8-4=4
Dim Exp, SelfDic, AddDic, DelDic, Result
'入口
Sub huocai()
Dim i
Exp = InputBox("移动一根火柴,使其成立", "", "6+4=4")
Result = ""
Call CreateData
For i = 1 To Len(Exp)
Call Rule(i, SelfDic)
Call Rule(i, AddDic, True) 'True表示替换两次(也可先传DelDic,调用时再传AddDic)
Next i
Debug.Print Len(Result)
MsgBox IIf(Len(Result), Result, "快去请如来佛祖..."), , "答案"
End Sub
'创建数据
Private Sub CreateData()
'按火柴数是否变化,分为两类:规则1 和 规则2
'规则1. 自变字符集
Set SelfDic = CreateObject("scripting.dictionary")
SelfDic("0") = Array(6, 9)
SelfDic("2") = Array(3)
SelfDic("3") = Array(2, 5)
SelfDic("5") = Array(3)
SelfDic("6") = Array(0, 9)
SelfDic("9") = Array(0, 6)
SelfDic("+") = Array("=")
SelfDic("=") = Array("+")
'规则2-1. 可加字符集
Set AddDic = CreateObject("scripting.dictionary")
AddDic("0") = Array(8)
AddDic("1") = Array(7)
AddDic("3") = Array(9)
AddDic("5") = Array(6, 9)
AddDic("6") = Array(8)
AddDic("9") = Array(8)
AddDic("-") = Array("=", "+")
'规则2-2. 可减字符集
Set DelDic = CreateObject("scripting.dictionary")
DelDic("6") = Array(5)
DelDic("7") = Array(1)
DelDic("8") = Array(0, 6, 9)
DelDic("9") = Array(3)
DelDic("+") = Array("-")
DelDic("=") = Array("-")
End Sub
'规则(位置, 字典, 是否替换两次)
Sub Rule(i, Dic, Optional IsTwo As Boolean = False)
Dim ch, t, j, k, tmp, tmp2
ch = Mid(Exp, i, 1)
If Dic.exists(ch) Then
t = Dic(ch)
For j = LBound(t) To UBound(t)
tmp = Exp
Mid(tmp, i, 1) = t(j)
If IsTwo Then
tmp2 = Exp '备份原始
Exp = tmp '拿已替换1次的去尝试
For k = 1 To Len(Exp) '遍历非i位置上的字符
If k <> i Then Call Rule(k, DelDic)
Next k
End If
If IsEqual(tmp) Then Result = Result & vbLf & tmp
If Len(tmp2) Then Exp = tmp2 '如果tmp2有内容,就用tmp2恢复原始
Next j
End If
End Sub
'判断
Function IsEqual(str) As Boolean
Dim A, l, r
A = Split(str, "=")
If UBound(A) = 1 Then
l = Application.Evaluate(A(0))
r = Application.Evaluate(A(1))
If VBA.IsNumeric(l) And VBA.IsNumeric(r) Then IsEqual = l = r
End If
End Function
30.rar
(87.88 KB, 下载次数: 2)
1)图片只为方便自己看字符是咋变的,没别的意义
2)x = "备份,调用,再备份 .... 恢复"
在x之前,感觉舒畅;一到x处,就卡住了,想很久,没写出当调用加后再如何减,
后来稀里糊涂试出现可得到结果的方法,不知还有没有错误,等学习
3)我没想出替换Evaluate的方式,等学习,你急用的话就用49楼吧
|
|