Hihocoder第九十八週 搜索一·24點

描述

週末,小Hi和小Ho都在家待着。
在收拾完房間時,小Ho偶然發現了一副撲克,於是兩人考慮用這副撲克來打發時間。
小Ho:玩點什麼好呢?
小Hi:兩個人啊,不如來玩24點怎麼樣,不靠運氣就靠實力的遊戲。
小Ho:好啊,好啊。
<經過若干局遊戲之後>
小Ho:小Hi,你說如果要寫個程序來玩24點會不會很複雜啊?
小Hi:讓我想想。
<過了幾分鐘>
小Hi:我知道了!其實很簡單嘛。
24點
小Hi:小Ho,你仔細觀察我們計算24點的方法,來總結有幾種情況。
假設我們用⊙表示運算,⊙除了可以表示基本的”+”,”-“,”*”,”/”外。我們還引入兩個新的運算,”反-“,和”反/”。
比如(a 反/ b)的意思是(b / a)。則對形如(c / (a + b))的形式,就可以等價的描述爲((a + b) 反/ c)。
利用這6種運算,可以將所有可能的計算過程歸結爲2類:
(((a ⊙ b) ⊙ c ) ⊙ d)
((a ⊙ b) ⊙ (c ⊙ d))
小Ho:恩..(小Ho思考了一下)..好像確實是這樣。
小Hi:既然我們已經找到了固定的模式,那麼剩下的就比較簡單了。
將4張牌的值,分別代入a,b,c,d,再把可能的運算符也代入。就可以得到相應的計算式子,將其計算出來,再檢查結果是否等於24。
那麼小Ho,你覺得有多少種情況呢?
小Ho:由於我們有4個數,所以對於a,b,c,d的對應關係有4!=24種情況。3個運算符,每個運算符可能有6種情況,那就是6^3=216。再考慮到2種不同的模式,所以一共有2 * 24 * 216 = 10368種情況。
小Hi:你的計算中並沒有考慮等價的情況,比如a + b 和 b + a,所以實際的情況數其實是小於10368種的。
不過由於對計算機而言,10368種情況數本來也不是很多,而要考慮等價反而顯得比較麻煩。所以我們可以不要去考慮加法和乘法的可逆性,直接枚舉所有的情況。
那麼最後還是由小Ho你來給出參考的僞代碼吧。
小Ho:嗯,這次的僞代碼:

used[] = false
nowNumber[] = {0,0,0,0}
ops[] = {0,0,0}
opType = {+,-,*,/,反-,反/}

makeNumber(depth):
    If (depth >= 4) Then
        // 此時已經枚舉完a,b,c,d
        // 開始枚舉運算符
        Return makeOperation(0)
    End If
    For i = 1 .. 4
        If (not used[i]) Then   // 每個數字只能使用一次
            nowNumber[ depth ] = number[i]
            used[i] = true
            If (makeNumber(depth + 1)) Then
                Return True
            End If
            used[i] = false
        End If
    End For
    Return False

makeOperation(depth):
    If (depth >= 3) Then
        // 此時已經枚舉完a,b,c,d和三個運算符
        // 計算在(((a ⊙ b) ⊙ c ) ⊙ d)形式下的值
        If (calcType1(nowNumber, ops) == 24) Then
            Return true;
        End If
        // 計算在((a ⊙ b) ⊙ (c ⊙ d))形式下的值
        If (calcType2(nowNumber, ops) == 24) Then
            Return true;
        End If
        Return false
    End If
    For i = 1 .. 6
        ops[ depth ] = opType[i]
        If (makeOperation(depth + 1)) Then
            Return True
        End If
    End For
    Return False

Main:
    input(number)
    used[] = false
    makeNumber(0)

輸入
第1行:1個正整數, t,表示數據組數,2≤t≤100。
第2..t+1行:4個正整數, a,b,c,d,1≤a,b,c,d≤10。
輸出
第1..t行:每行一個字符串,第i行表示第i組能否計算出24點。若能夠輸出”Yes”,否則輸出”No”。

發佈了20 篇原創文章 · 獲贊 13 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章