雀魂啓動!
暴力對每一個出現次數 >= 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;
}