時間限制:10000ms
單點時限:1000ms
記憶體限制:256mb
描述週末,小hi和小ho都在家待著。
在收拾完房間時,小ho偶然發現了一副撲克,於是兩人考慮用這副撲克來打發時間。
小ho:玩點什麼好呢?
小hi:兩個人啊,不如來玩24點怎麼樣,不靠運氣就靠實力的遊戲。
小ho:好啊,好啊。
《經過若干局遊戲之後》
小ho:小hi,你說如果要寫個程式來玩24點會不會很複雜啊?
小hi:讓我想想。
《過了幾分鐘》
小hi:我知道了!其實很簡單嘛。
輸入第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"。
樣例輸入
25 5 5 1
9 9 9 9
樣例輸出
yes
no小hi:小ho,你仔細觀察我們計算24點的方法,來總結有幾種情況。什麼是24點
這裡有hiho的解釋,不過我是直接暴力的。
假設我們用⊙表示運算,⊙除了可以表示基本的"+","-","*","/"外。我們還引入兩個新的運算,"反-",和"反/"。
比如(a 反/ b)的意思是(b / a)。則對形如(c / (a + b))的形式,就可以等價的描述為((a + b) 反/ c)。
利用這6種運算,可以將所有可能的計算過程歸結為2類:
(((a ⊙ b) ⊙ c ) ⊙ d)
((a ⊙ b) ⊙ (c ⊙ d))
小hi:既然我們已經找到了固定的模式,那麼剩下的就比較簡單了。小ho:恩..(小ho思考了一下)..好像確實是這樣。
將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 = falsenownumber = ops = 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)
我的**:
/**************************************
* *
* -*- coding: utf-8 -*- *
* @date : 2016-05-16 11:11:21 *
* @author : zeroinger *
* *
************************************
*/#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
double data[4];
bool ok(double a,doubleb)
bool dfs(intn)
if(!ok(t2,0
))
data[i]=t1;
data[
2]=t2;
}} }
intmain()
return0;
}
hiho之搜尋 24點
小hi 小ho,你仔細觀察我們計算24點的方法,來總結有幾種情況。假設我們用 表示運算,除了可以表示基本的 外。我們還引入兩個新的運算,反 和 反 比如 a 反 b 的意思是 b a 則對形如 c a b 的形式,就可以等價的描述為 a b 反 c 利用這6種運算,可以將所有可能的計算過程歸結為2類...
Leetcode 經典回溯搜尋 24點遊戲
先從四個數中,取處兩個數,共有6種取法。由於減法和除法運算不具有交換律,所以應該考慮順序 共有12種選法 然後從四個符號選出乙個來運算,共有4種選法。還剩下三個數,取出兩個數,共有3種選法,6 然後再運算,共有4種 下面還剩下兩個數,取出兩個數運算,共有4種 2 12 4 6 4 2 4 9216種...
洛谷P1236 算24點 搜尋
給出四個整數,求能否經過一系列運算使得這四個數字最終組成24。注意 運算的任意時刻數字均必須為整數。很顯然的搜尋嘛。可以考慮每次列舉使用那兩個數字進行運算,然後再列舉使用哪一種運算方法 加減乘除 把用過的數字修改成 1.最終搜尋完之後判斷有沒有乙個數字變成了24即可。思路還是比較簡單,注意細節即可。...