|
本帖最后由 lingyuncelia1 于 2016-2-29 10:08 编辑
本人想写一个数独的三链数法代码。
在前9个单元格中,红色数字是候选数,候选数是大于一位的,每个格的红色数的数字绝不重复(如B1:157,绝对不会出现155之类),且是升序排列的(如B1:157,绝对不会是175或751之类)。如果我们发现前9格有三个格子只使用了三个候选数(肉眼发现是457),那么这三个格子(最后3格的数字全部包含于K1内的457)必然正好是这三个数字,那么在这9格中,其它格子不会出现这三个候选数(因此B1的数字5与7去掉,F1的4去掉),这就是三链数法。
如上图,运行以下代码,变右图:
Sub ba()
Dim reg, s As Range, m, n As Integer
Set reg = CreateObject("vbscript.regexp")
With reg
.Global = True
.Pattern = "[" & [k1] & "]"
For Each s In Range("a1:i1")
Set m = .Execute(s.Value)
If Len(s) = 3 And m.Count = 3 Then s.Font.Size = 36
If Len(s) = 2 And m.Count = 2 Then s.Font.Size = 36
If s.Font.Size = 36 Then n = n + 1
Next
End With
Set reg = Nothing
If n = 3 Then
a = Mid(Cells(1, 11).Text, 1, 1)
b = Mid(Cells(1, 11).Text, 2, 1)
c = Mid(Cells(1, 11).Text, 3, 1)
For Each s In Range("a1:i1")
If s.Font.Size = 11 Then s.Value = Replace(s.Text, a, ""): s.Value = Replace(s.Text, b, ""): s.Value = Replace(s.Text, c, "")
Next
Else
For Each s In Range("a1:i1")
If s.Font.Size = 36 Then s.Font.Size = 11
Next
End If
End Sub
但是,如果将代码改成以下这样则无效,为什么呢?
Sub ba()
Dim reg, s As Range, m, n As Integer
For a = 1 To 7
For b = a + 1 To 8
For c = b + 1 To 9
Set reg = CreateObject("vbscript.regexp")
With reg
.Global = True
.Pattern = "[a & b & c]"
For Each s In Range("a1:i1")
Set m = .Execute(s.Value)
If Len(s) = 3 And m.Count = 3 Then s.Font.Size = 36
If Len(s) = 2 And m.Count = 2 Then s.Font.Size = 36
If s.Font.Size = 36 Then n = n + 1
Next
End With
Set reg = Nothing
If n = 3 Then
For Each s In Range("a1:i1")
If s.Font.Size = 11 Then s.Value = Replace(s.Text, a, ""): s.Value = Replace(s.Text, b, ""): s.Value = Replace(s.Text, c, "")
Next
Else
For Each s In Range("a1:i1")
If s.Font.Size = 36 Then s.Font.Size = 11
Next
End If
Next c
Next b
Next a
End Sub
|
|