/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;
}