[编程题]雀魂启动!
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;
}