Giải trí với bài toán 'Knock out chào 2022' trên VnExpress

Liên hệ QC

huuthang_bd

Chuyên gia GPE
Tham gia
10/9/08
Bài viết
8,709
Được thích
10,814
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Thợ đụng
Đối với những người mới tập viết code thì thuật toán vét cạn có lẽ là khá khó, thậm chí đọc hiểu code viết sẵn cũng không đơn giản, nhất là khi code sử dụng phương pháp đệ quy.
Tôi đọc báo VnExpress thì tình cờ thấy được bài toán này. Để giải bài toán có thể có nhiều cách nhưng tôi thấy đây là một bài toán phù hợp để luyện tập viết code theo thuật toán vét cạn. Tôi đăng lên đây ai cảm thấy hứng thú thì tham gia nhé.

1642229314506.png
 
Rảnh viết thử vầy có được không anh.
Mã:
Option Explicit
Public Const giatri = 2022
Public aRow As Long

Public Sub Try(k As Integer, sValue As String)
    Dim PhuongAN(), j As Integer
    PhuongAN = Array("", "+", "-", "*", "/")
    If k = 9 Then
        If Evaluate(sValue) = giatri Then
            aRow = aRow + 1
            Range("A" & aRow).Value = sValue & " = " & Evaluate(sValue)
        End If
    Else
        For j = LBound(PhuongAN) To UBound(PhuongAN)
            If k < 10 Then
                Try k + 1, sValue + PhuongAN(j) + CStr(k + 1)
            End If
        Next j
    End If
End Sub

Public Sub Main()
    Range("A:A").Clear
    aRow = 0
    Try 1, "1"
    MsgBox "Da xong", , "GPE"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Rảnh viết thử vầy có được không anh.
Mã:
Option Explicit
Public Const giatri = 2022
Public aRow As Long

Public Sub Try(k As Integer, sValue As String)
    Dim PhuongAN(), j As Integer
    PhuongAN = Array("", "+", "-", "*", "/")
    If k = 9 Then
        If Evaluate(sValue) = giatri Then
            aRow = aRow + 1
            Range("A" & aRow).Value = sValue & " = " & Evaluate(sValue)
        End If
    Else
        For j = LBound(PhuongAN) To UBound(PhuongAN)
            If k < 10 Then
                Try k + 1, sValue + PhuongAN(j) + CStr(k + 1)
            End If
        Next j
    End If
End Sub

Public Sub Main()
    Range("A:A").Clear
    aRow = 0
    Try 1, "1"
    MsgBox "Da xong", , "GPE"
End Sub
Dòng If k < 10 Then nên đưa ra ngoài vòng lặp For j và biến PhuongAN nên đưa ra ngoài thành biến toàn cục.
--
Góp thêm phương án không dùng đệ quy:
Mã:
Sub KnockOut()
Const Operators As String = " +-*/", sBegin As String = "1 2 3 4 5 6 7 8 9"
Dim sText As String, i As Long
sText = sBegin
Do
    If Evaluate(Replace(sText, " ", "")) = 2022 Then Debug.Print "=" & Replace(sText, " ", "")
    For i = Len(sText) - 1 To 2 Step -2
        If Mid(sText, i, 1) <> Right(Operators, 1) Then
            Mid(sText, i) = Mid(Operators, InStr(Operators, Mid(sText, i, 1)) + 1, 1) & Mid(sBegin, i + 1)
            Exit For
        End If
    Next
Loop Until sText = "1/2/3/4/5/6/7/8/9"
End Sub
 
Upvote 0
Web KT
Back
Top Bottom