小hi:小ho,你仔細觀察我們計算24點的方法,來總結有幾種情況。
假設我們用⊙表示運算,⊙除了可以表示基本的"+","-","*","/"外。我們還引入兩個新的運算,"反-",和"反/"。
比如(a 反/ b)的意思是(b / a)。則對形如(c / (a + b))的形式,就可以等價的描述為((a + b) 反/ c)。
利用這6種運算,可以將所有可能的計算過程歸結為2類:
(((a ⊙ b) ⊙ c ) ⊙ d)小ho:恩..(小ho思考了一下)..好像確實是這樣。((a ⊙ b) ⊙ (c ⊙ d))
小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種情況數本來也不是很多,而要考慮等價反而顯得比較麻煩。所以我們可以不要去考慮加法和乘法的可逆性,直接列舉所有的情況。
#include#include#includeusing namespace std;
int t;
bool used[4];
double nownumber[4],number[4];
char optype=,ops[3];
double calc(double a, double b, char c)
return s;
}bool makeoperation(int depth)
for(int i=0;i<6;i++)
return false;
}bool makenumber(int depth)
}return false;
}int main()
}
大神的解法:
next_permutation(a,a+4); 遞增
prev_permutation(a,a+4); 遞減
#include#include#includeusing namespace std;
double a[4];
bool flag;
double so(double a,double b,int k)
return s;
} bool pan(int i,int j,int k)
void solve()
} int main()
while(next_permutation(a,a+4));
if(flag)printf("yes\n");
else printf("no\n");
} return 0;
}
搜尋一 24點(hiho98)
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述週末,小hi和小ho都在家待著。在收拾完房間時,小ho偶然發現了一副撲克,於是兩人考慮用這副撲克來打發時間。小ho 玩點什麼好呢?小hi 兩個人啊,不如來玩24點怎麼樣,不靠運氣就靠實力的遊戲。小ho 好啊,好啊。經過若干...
Leetcode 經典回溯搜尋 24點遊戲
先從四個數中,取處兩個數,共有6種取法。由於減法和除法運算不具有交換律,所以應該考慮順序 共有12種選法 然後從四個符號選出乙個來運算,共有4種選法。還剩下三個數,取出兩個數,共有3種選法,6 然後再運算,共有4種 下面還剩下兩個數,取出兩個數運算,共有4種 2 12 4 6 4 2 4 9216種...
24點之原來如此
24點之原來如此 以上可以用來檢驗問題,僅供參考實際上思維的開發還需要自己多練,所以個人建議,除了加減乘數運算外,還建議增加特殊單目運算子 次方 3 3 2 3 3 9 階乘 如3!3 2 1 6 開方 如 9 3 求模 mod,如10mod3 1,因為10 3 3 1 附 24點簡介 算 24點 ...