LUA 算24点 列出所有解法

--MyDebugTools

--priority
SUB = 1
ADD = 2
DIV = 3
MUL = 4
DIGIT = 5

function MergeNode(tbNode1 , tbNode2 , szOperator)
    tbNode = {}
    ----ADD----
    if szOperator == "+" then
        tbNode.Num = tbNode1.Num + tbNode2.Num
        tbNode.Pri = ADD
        tbNode.Str = tbNode1.Str.." + "..tbNode2.Str
    ----MUL----
    elseif szOperator == "*" then
        tbNode.Num = tbNode1.Num * tbNode2.Num
        tbNode.Pri = MUL
        if(tbNode1.Pri < MUL) then
            tbNode.Str = "("..tbNode1.Str..") * "
        else
            tbNode.Str = tbNode1.Str.." * "
        end
        if(tbNode2.Pri < MUL) then
            tbNode.Str = tbNode.Str.."("..tbNode2.Str..")"
        else
            tbNode.Str = tbNode.Str..tbNode2.Str
        end
    ----SUB----
    elseif szOperator == "-" then
        tbNode.Num = tbNode1.Num - tbNode2.Num
        tbNode.Pri = SUB
        if(tbNode2.Pri < DIV) then
            tbNode.Str = tbNode1.Str.." - ("..tbNode2.Str..")"
        else
            tbNode.Str = tbNode1.Str.." - "..tbNode2.Str
        end
    ----DIV----
    elseif szOperator == "/" then
        tbNode.Num = tbNode1.Num / tbNode2.Num
        tbNode.Pri = DIV
        if(tbNode1.Pri <= DIV) then
            tbNode.Str = "("..tbNode1.Str..") / "
        else
            tbNode.Str = tbNode1.Str.." / "
        end
        if(tbNode2.Pri < DIGIT) then
            tbNode.Str = tbNode.Str.."("..tbNode2.Str..")"
        else
            tbNode.Str = tbNode.Str..tbNode2.Str
        end
    end
    return tbNode
end

tblstAns = {}
function Calculate(tblstNode)
    local nLen = #tblstNode
    if(nLen == 1) then
        if(tblstNode[1].Num == 24) then
            table.insert(tblstAns ,tblstNode[1].Str)
        end
        return
    end


    for i = 1 , nLen do
        for j = i + 1 , nLen do
            local tbTmpLst = {}
            for k = 1 , nLen do
                repeat
                    if( k == i or k == j) then
                        break
                    end
                table.insert(tbTmpLst,tblstNode[k])
                until true
            end
            local nEnd = #tbTmpLst + 1
            tbTmpLst[nEnd] = MergeNode(tblstNode[i],tblstNode[j],"+")
            Calculate(tbTmpLst)
            tbTmpLst[nEnd] = MergeNode(tblstNode[i],tblstNode[j],"*")
            Calculate(tbTmpLst)
            tbTmpLst[nEnd] = MergeNode(tblstNode[i],tblstNode[j],"-")
            Calculate(tbTmpLst)
            tbTmpLst[nEnd] = MergeNode(tblstNode[j],tblstNode[i],"-")
            Calculate(tbTmpLst)
            tbTmpLst[nEnd] = MergeNode(tblstNode[i],tblstNode[j],"/")
            Calculate(tbTmpLst)
            tbTmpLst[nEnd] = MergeNode(tblstNode[j],tblstNode[i],"/")
            Calculate(tbTmpLst)
        end
    end
    return
end

function Calculate24(...)
    local tblstNode = {}
    for i , v in ipairs {...} do
        tbNode = {}
        tbNode.Num = v
        tbNode.Str = tostring(v)
        tbNode.Pri = DIGIT
        tblstNode[i] = tbNode
    end
    Calculate(tblstNode)
    n ={}
    for i = 1 , #tblstAns  do
        print(tblstAns[i].."\n")
    end
end

function Main()
    Calculate24(5,4,12,9)
end

Main()
 

猜你喜欢

转载自blog.csdn.net/baidu_30577741/article/details/81077970
LUA