雀魂启动!

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 
#include 
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;
}

你可能感兴趣的:(#,编程题)