khuongvietphong
Be all you can be !
- Tham gia
- 6/7/14
- Bài viết
- 2,069
- Được thích
- 1,444
- Nghề nghiệp
- Ăn không ngồi rồi ^.^
Nếu các bạn cần đáp án để test, mình sẽ gởi lên
Em ra rồi ... em làm được rồi ..... .Em đã làm được rồi các anh ơi ........
kết quả thôi, còn code của mình không đúng nghĩa là code, chỉ làm bán thủ công thôiđáp án nghĩa là code giải sudoku hả ? gửi đi bạn . Tôi đang thắc không biết mình có sai ở đâu không mà sao thấy bài này dễ quá , nhiều khi tôi lầm ở đâu chăng ? nên bạn cho tôi tham khảo code của bạn nhé .![]()
giải được tức là nội công đã tăng lên , sắp trở thành cao thủ , sướng nhé .![]()
Option Explicit
Private arrResult
Public Sub hello()
Dim arr, r As Long, c As Long, dArr, str As String
arr = Sheet2.Range("A12").Resize(9, 9).Value
arrResult = ""
Solve arr
Sheet2.Range("M2").Resize(9, 9).ClearContents
Sheet2.Range("M2").Resize(9, 9).Value = arrResult
End Sub
Private Sub Solve(ByVal arr)
If Not IsArray(arrResult) Then
Dim r As Long, c As Long, tmpMin(1 To 3), str, has1situ As Boolean
For r = 1 To 9 Step 1
For c = 1 To 9 Step 1
If arr(r, c) = "" Then
str = situ(r, c, arr)
If Len(str) = 0 Then GoTo kt
If Len(str) = 1 Then
arr(r, c) = str
has1situ = True
Else
If Not has1situ Then
If Len(tmpMin(3)) = 0 Or Len(str) < Len(tmpMin(3)) Then
tmpMin(1) = r: tmpMin(2) = c: tmpMin(3) = str
End If
End If
End If
End If
Next
Next
If IsFinish(arr) Then
arrResult = arr
Else
If has1situ Then
Solve arr
Else
For r = 1 To Len(tmpMin(3)) Step 1
arr(tmpMin(1), tmpMin(2)) = Mid(tmpMin(3), r, 1)
Solve arr
Next
End If
End If
End If
kt:
End Sub
'get all situation for target cell ( i , j)
Private Function situ(i As Long, j As Long, arr) As String
Dim r As Long, c As Long
situ = "123456789"
For c = 1 To 9 Step 1
If arr(i, c) <> "" Then situ = Replace(situ, arr(i, c), "")
Next
For r = 1 To 9 Step 1
If arr(r, j) <> "" Then situ = Replace(situ, arr(r, j), "")
Next
For r = 3 * WorksheetFunction.RoundUp(i / 3, 0) - 2 To 3 * WorksheetFunction.RoundUp(i / 3, 0) Step 1
For c = 3 * WorksheetFunction.RoundUp(j / 3, 0) - 2 To 3 * WorksheetFunction.RoundUp(j / 3, 0) Step 1
If arr(r, c) <> "" Then situ = Replace(situ, arr(r, c), "")
Next
Next
End Function
Private Function IsFinish(arr) As Boolean
Dim r As Long, c As Long
IsFinish = False
For r = 1 To 9 Step 1
For c = 1 To 9 Step 1
If arr(r, c) = "" Then Exit Function
Next
Next
IsFinish = True
End Function
Code quá hay, bạn làm thêm đường chéo cho hoàn chỉnhđây cũng là ví dụ hay để luyện tư duy , tôi làm phát trước vậy
Code quá hay, bạn làm thêm đường chéo cho hoàn chỉnh
[TABLE="width: 261"]đường chéo là cái gì ? không hiểu ?
[TABLE="width: 261"]
[TR]
[TD]2[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]5[/TD]
[TD]8[/TD]
[TD]7[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]4[/TD]
[/TR]
[TR]
[TD]8[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]9[/TD]
[TD]2[/TD]
[TD]4[/TD]
[TD]7[/TD]
[TD]5[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]7[/TD]
[TD]4[/TD]
[TD]5[/TD]
[TD]3[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]9[/TD]
[TD]8[/TD]
[/TR]
[TR]
[TD]6[/TD]
[TD]5[/TD]
[TD]7[/TD]
[TD]4[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]1[/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]1[/TD]
[TD]8[/TD]
[TD]4[/TD]
[TD]6[/TD]
[TD]7[/TD]
[TD]2[/TD]
[TD]5[/TD]
[TD]3[/TD]
[TD]9[/TD]
[/TR]
[TR]
[TD]9[/TD]
[TD]2[/TD]
[TD]3[/TD]
[TD]8[/TD]
[TD]5[/TD]
[TD]1[/TD]
[TD]4[/TD]
[TD]7[/TD]
[TD]6[/TD]
[/TR]
[TR]
[TD]5[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]7[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]3[/TD]
[TD]4[/TD]
[TD]1[/TD]
[/TR]
[TR]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]1[/TD]
[TD]4[/TD]
[TD]5[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]7[/TD]
[/TR]
[TR]
[TD]4[/TD]
[TD]7[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]6[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]5[/TD]
[/TR]
[/TABLE]
là đường màu đỏ xanh không được trùng
[TABLE="width: 261"]
[TR]
[TD]2[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]5[/TD]
[TD]8[/TD]
[TD]7[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]4[/TD]
[/TR]
[TR]
[TD]8[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]9[/TD]
[TD]2[/TD]
[TD]4[/TD]
[TD]7[/TD]
[TD]5[/TD]
[TD]3[/TD]
[/TR]
[TR]
[TD]7[/TD]
[TD]4[/TD]
[TD]5[/TD]
[TD]3[/TD]
[TD]1[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]9[/TD]
[TD]8[/TD]
[/TR]
[TR]
[TD]6[/TD]
[TD]5[/TD]
[TD]7[/TD]
[TD]4[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]1[/TD]
[TD]2[/TD]
[/TR]
[TR]
[TD]1[/TD]
[TD]8[/TD]
[TD]4[/TD]
[TD]6[/TD]
[TD]7[/TD]
[TD]2[/TD]
[TD]5[/TD]
[TD]3[/TD]
[TD]9[/TD]
[/TR]
[TR]
[TD]9[/TD]
[TD]2[/TD]
[TD]3[/TD]
[TD]8[/TD]
[TD]5[/TD]
[TD]1[/TD]
[TD]4[/TD]
[TD]7[/TD]
[TD]6[/TD]
[/TR]
[TR]
[TD]5[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]7[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]3[/TD]
[TD]4[/TD]
[TD]1[/TD]
[/TR]
[TR]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]1[/TD]
[TD]4[/TD]
[TD]5[/TD]
[TD]6[/TD]
[TD]2[/TD]
[TD]7[/TD]
[/TR]
[TR]
[TD]4[/TD]
[TD]7[/TD]
[TD]1[/TD]
[TD]2[/TD]
[TD]6[/TD]
[TD]3[/TD]
[TD]9[/TD]
[TD]8[/TD]
[TD]5[/TD]
[/TR]
[/TABLE]
là đường màu đỏ xanh không được trùng
đây cũng là ví dụ hay để luyện tư duy , tôi làm phát trước vậy