雀魂啓動!

https://www.nowcoder.com/practice/448127caa21e462f9c9755589a8f2416?tpId=0&tqId=0&rp=10&ru=/ta/2019test&qru=/ta/2019test/question-ranking

雀魂啓動!

  暴力對每一個出現次數 >= 2 的數作爲雀頭進行嘗試,然後剩下的 12 個數,出現次數 >= 3 的,那麼其中三張要不都組成順子,要不都組成刻子,先按刻子進行嘗試,出現次數是 1 或者 2 的,只能是順子。

#include <iostream>
#include <vector>
using namespace std;

bool dfs(vector<int> a) {
    // 三個或者四個,先按其中三個是刻子(三連順子也就是三個刻子)
    for(int i = 1; i <= 9; ++i)
        if(a[i] >= 3) {
            a[i] -= 3;
            if(dfs(a)) return true;
            a[i] += 3;
        }
    // 一個或者兩個只能是順子
    for(int i = 1; i <= 7; ++i)
        while(a[i] >= 1) {
            --a[i]; --a[i + 1]; --a[i + 2];
        }
    for(int i = 1; i <= 9; ++i)
        if(a[i] != 0)
            return false;
    return true;
}

bool canWin(vector<int> a) {
    for(int i = 1; i <= 9; ++i) {
        if (a[i] < 2) continue;
        a[i] -= 2;    // 當雀頭
        if(dfs(a))
            return true;
        a[i] += 2;
    }
    return false;
}

int main(){
    vector<int> cnt(10, 0);
    for(int i = 0; i < 13; ++i) {
        int t;
        cin >> t;
        ++cnt[t];
    }
    bool found = false;
    for(int i = 1; i <= 9; ++i) {
        if(cnt[i] == 4) continue;
        ++cnt[i];
        if(canWin(cnt)) {
            cout << i << ' ';
            found = true;
        }
        --cnt[i];
    }
    if(!found)
        cout << '0' << endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章