准备按以下思路写代码:
第一步:
从第一个位置开始的循环试算检查方法,
但检查值从 1 to 9 改进为 有效数。(这样做本省节省的时间并不很多)
第二步:
接下来,要结合引进【对于新确定唯一数后,立即检查排除同行、同列、同宫中的有效数,
以便不用等待循环就能快速提前得出唯一数。
目前第二步的准备已经做好(快速检查同行、同列、同宫的方法)
但具体检查代码还未加入。
先把半成品代码贴上来。- Option Explicit
- Option Base 1
- Type zb
- h As Long
- l As Long
- g As Long
- hlg(1 To 20) As Long
- n As Long
- s As String
- s1 As String
- End Type
- Sub shudu_kagawa3()
- Dim jc&(3, 9, 9), sj(81) As zb
- Dim sj0, xh&(81), yg&(81), gc(82, 3), jg$(81), jl&(81), jc1, jg1, jl1
- Dim i&, j&, k&, l&, m&, n&, r&, s$, t&, u&, v&, tms#
- tms = Timer
-
- sj0 = [b2].Resize(9, 9)
- For i = 1 To 9
- For j = 1 To 9
- k = ((i - 1) \ 3) * 3 + (j - 1) \ 3 + 1
- m = m + 1
- sj(m).h = i
- sj(m).l = j
- sj(m).g = k
-
- n = sj0(i, j)
- If n Then
- jc(1, i, n) = 1
- jc(2, j, n) = 1
- jc(3, k, n) = 1
- Else
- l = l + 1
- xh(l) = m
- End If
- Next
- Next
-
- u = 0
- For n = 1 To l
- m = xh(n)
- i = sj(m).h
- j = sj(m).l
- k = sj(m).g
-
- r = 0
- For t = 1 To l
- If t <> n Then
- If sj(xh(t)).h = i Or sj(xh(t)).l = j Or sj(xh(t)).g = k Then
- r = r + 1: sj(m).hlg(r) = xh(t)
- End If
- End If
- Next
- sj(m).n = r
-
- s = ""
- For t = 1 To 9
- If jc(1, i, t) = 0 Then
- If jc(2, j, t) = 0 Then
- If jc(3, k, t) = 0 Then
- s = s & t
- End If
- End If
- End If
- Next
- sj(m).s = s
- jg(n) = s
-
- If Len(s) = 1 Then
- u = u + 1
- yg(u) = m
- ' jc(1, i, s) = 1
- ' jc(2, j, s) = 1
- ' jc(3, k, s) = 1
- ' Stop
- End If
- Next
- ' MsgBox Format(Timer - tms, "0.000s")
-
- gc(1, 1) = jc 'Check
- gc(1, 2) = jg 's
- gc(2, 3) = jl 't
- jc1 = jc
- jg1 = jg
- jl1 = jl
-
- For n = 1 To l
- m = xh(n)
- i = sj(m).h
- j = sj(m).l
- k = sj(m).g
-
- s = jg1(n)
- ' If Len(s) = 1 Then
- ' t = 0
- ' Else
- For t = jl1(n) + 1 To Len(s)
- v = Mid(s, t, 1)
- If jc1(1, i, v) = 0 Then
- If jc1(2, j, v) = 0 Then
- If jc1(3, k, v) = 0 Then
- jc1(1, i, v) = 1
- jc1(2, j, v) = 1
- jc1(3, k, v) = 1
- jg1(n) = v
- jl1(n) = t
-
- Exit For
- End If
- End If
- End If
- Next
- ' End If
- If t > Len(s) Then
- m = xh(n - 1)
- jc1 = gc(n - 1, 1)
- jg1 = gc(n - 1, 2)
- jl1 = gc(n - 1, 3)
-
- v = Mid(jg1(n - 1), jl1(n - 1), 1)
- jc1(1, sj(m).h, v) = 0
- jc1(2, sj(m).l, v) = 0
- jc1(3, sj(m).g, v) = 0
- n = n - 2
- Else
- gc(n + 1, 1) = jc1 'Check
- gc(n + 1, 2) = jg1 's
- gc(n, 3) = jl1 't
- End If
- Next
- ' MsgBox Format(Timer - tms, "0.000s")
- For n = 1 To l
- m = xh(n)
- sj0(sj(m).h, sj(m).l) = jg1(n)
- Next
-
- [b12].Resize(9, 9) = sj0
- MsgBox Format(Timer - tms, "0.0000s")
-
- End Sub
复制代码 |