「RQNOJ73」24點

題目描述 Description


superwyh是一個非常瘋狂的24點愛好者,空閒時總是自己拿出撲克來算24點,24點的規則很簡單,就是給你4張撲克(從1至13,用A代替1,J代替11,Q代替12,K代替13)通過加減乘除來求得24,各位oier幫了superwyh好多忙,爲了報答大家superwyh就和大家做個24點的遊戲,superwyh給大家4張牌大家告訴superwyh能不能湊成24就行。

[renqing PS:這道題很easy,是送分的題]


輸入描述 Input Description


輸入格式4張牌的牌面(1<=n<=13)。


輸出描述 Output Description


輸出格式如果能湊成輸出”yes”反之輸出”no”。


樣例輸入 Sample Input


A 2 3 4


樣例輸出 Sample Output


yes


數據範圍及提示 Data Size && Hint


1<=n<=131<=n<=13


解題思路 Solve Idea

這裏我們看到應該可以反映過來,這是一個搜索的題目,那麼遇到搜索題目首先我們應該怎麼做呢?當然是找到問題的解空間,這裏的解空間是什麼呢?當然是4張牌和四則運算組合而成的所有表達式,有了這個思路,我們就可以開始暴力搜索了。

**坑點:**這裏有一個大坑就是除法計算可能會出現浮點誤差和出現浮點數,所以我們要對sum使用double類型的,然後對sum判斷浮點誤差。


代碼 Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 105;
const int INF = 0x3f3f3f3f;
bool used[5];
int a[5], card[5];
const double eps = 1e-6;
bool dfs(int cur, double sum)
{
    if(cur == 4) {
        if(fabs(sum - 24.0) <= eps) return true; // 這題的除法可能會有浮點數誤差,所以sum要用double類型
        return false;
    }
    for(int i = 0; i < 4; ++i) {
        if(used[i]) continue;
        used[i] = true;
        if(dfs(cur + 1, sum + card[i])) return true;
        if(dfs(cur + 1, sum - card[i])) return true;
        if(dfs(cur + 1, card[i] - sum)) return true;
        if(sum && dfs(cur + 1, sum * card[i])) return true;
        if(sum && dfs(cur + 1, sum / card[i])) return true;
        if(sum && dfs(cur + 1, card[i] / sum)) return true;
        used[i] = false;
    }
    return false;
}

int main()
{
    for(int i = 0; i < 4; ++i) {
        string s;
        cin >> s;
        if(s[0] == 'A') card[i] = 1;
        else if(s[0] == 'J') card[i] = 11;
        else if(s[0] == 'Q') card[i] = 12;
        else if(s[0] == 'K') card[i] = 13;
        else if(s[0] == '1' && card[1] == '0') card[i] = 10;
        else card[i] = s[0] - '0';
    }
    if(dfs(0, 0)) puts("yes");
    else puts("no");
    return 0;
} 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章