2020-03-14

[编程题]雀魂启动!

1 1 1 2 2 2 6 6 6 7 7 7 9 9 可以组成1,2,6,7的4个刻子和9的雀头,可以和牌
1 1 1 1 2 2 3 3 5 6 7 7 8 9 用1做雀头,组123,123,567,789的四个顺子,可以和牌
1 1 1 2 2 2 3 3 3 5 6 7 7 9 无论用1 2 3 7哪个做雀头,都无法组成和牌的条件。

现在,小包从36张牌中抽取了13张牌,他想知道在剩下的23张牌中,再取一张牌,取到哪几种数字牌可以和牌。

输入描述:
输入只有一行,包含13个数字,用空格分隔,每个数字在1~9之间,数据保证同种数字最多出现4次。

输出描述:
输出同样是一行,包含1个或以上的数字。代表他再取到哪些牌可以和牌。若满足条件的有多种牌,请按从小到大的顺序输出。若没有满足条件的牌,请输出一个数字0

#include <iostream>
#include <vector>
using namespace std;
bool sol(vector<int> v, int begin, bool head){
    if(begin == 9 && v[begin] == 0) return true;
    if(v[begin] == 0) return sol(v, begin + 1, head);
    if (v[begin] >= 3){
        v[begin] -= 3;
        if (sol(v, begin, head)) return true;
        v[begin] += 3;
    }
    if(begin <= 7 && v[begin] >= 1 && v[begin + 1] >= 1 && v[begin + 2] >= 1){
        v[begin]--;
        v[begin+1]--;
        v[begin+2]--;
        if(sol(v, begin, head)) return true;
        v[begin]++;
        v[begin+1]++;
        v[begin+2]++;
    }
    if(head ==false && v[begin] >= 2){
        v[begin] -= 2;
        head = true;
        if (sol(v, begin, head)) return true;
        v[begin] += 2;
    }
    return false;
}
int main(){
    int n;
    int flag = 0;
    vector<int> v(10,0);
    for(int i = 0;i < 13;i++){
        cin >> n;
        v[n]++;
    }
    for(int i = 1;i < 10;i++){
        if(v[i] == 4) continue;
        v[i]++;
        if(sol(v, 1, false)){
            cout<< i << " ";
            flag = 1;
        }
        v[i]--;
    }
    if(flag == 0) cout << 0;
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容