搜尋一 24點(hiho98)

2022-08-21 08:15:11 字數 3376 閱讀 8242

時間限制: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"。

樣例輸入

2

5 5 5 1

9 9 9 9

樣例輸出

yes

no

什麼是24點

這裡有hiho的解釋,不過我是直接暴力的。

小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 = 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即可。思路還是比較簡單,注意細節即可。...