题目链接:UVA - 11210
题解
蓝书讲的很清楚,但是美中不足的是判断胡牌其实可以不用dfs判断,完全可以枚举,有的题可能会卡你dfs,比如2021 icpc的昆明~
代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<unordered_set>
#include<unordered_map>
using namespace std;
//extern "C"{void *__dso_handle=0;}
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define lowbit(x) x&-x
const double PI=acos(-1.0);
const double eps=1e-6;
const ll mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=1e5+10;
const int maxm=100+10;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
string majiang[34]={
"1T","2T","3T","4T","5T","6T","7T","8T","9T",
"1S","2S","3S","4S","5S","6S","7S","8S","9S",
"1W","2W","3W","4W","5W","6W","7W","8W","9W",
"DONG", "NAN", "XI", "BEI", "ZHONG", "FA", "BAI"
};
int mj[15],c[35];
int convert(string s)
{
for(int i=0;i<34;i++)
if(majiang[i]==s) return i;
return -1;
}
bool dfs(int step)
{
//刻子
for(int i=0;i<34;i++) {
if(c[i]>=3)
{
if(step==3) return true;
c[i]-=3;
if(dfs(step+1)) return true;
c[i]+=3;
}
}
//顺子
for(int i=0;i<=24;i++)
{
if(i%9<=6 && c[i]>=1 && c[i+1]>=1 && c[i+2]>=1)
{
if(step==3) return true;
c[i]-=1; c[i+1]-=1; c[i+2]-=1;
if(dfs(step+1)) return true;
c[i]+=1; c[i+1]+=1; c[i+2]+=1;
}
}
return false;
}
bool check()
{
for(int i=0;i<34;i++)
{
if(c[i]>=2)
{
c[i]-=2;
if(dfs(0)) return true;
c[i]+=2;
}
}
return false;
}
int main()
{
ios;
int cas=0;
string s;
while (cin >> s) {
if(s[0]=='0') break;
mj[0]=convert(s);
for(int i=1;i<13;i++)
{
string tmp; cin >> tmp;
mj[i] = convert(tmp);
}
cout << "Case " << ++cas << ":";
bool ok=false;
for(int i=0;i<34;i++)
{
memset(c, 0, sizeof(c));
for(int j=0;j<13;j++) c[mj[j]]++;
if(c[i]>=4) continue;
c[i]++;
if(check())
{
ok = true;
cout << ' ' << majiang[i];
}
c[i]--;
}
if(!ok) cout << " Not ready" << endl;
else cout << endl;
}
return 0;
}