解题思路:
关键在于如何判断十四张牌能否和牌,这里采用dfs来判断,详情看代码。
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <stack> using namespace std; const int maxn = 1000 + 10; string card[] = { "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"}; string S[20]; int C[maxn]; int h[maxn]; int id(string s) { for(int i=0;i<34;i++) if(s == card[i]) return i; return -1; } int dfs(int dep) { for(int i=0;i<34;i++) if(h[i] >= 3) { if(dep == 3) return 1; h[i] -= 3; if(dfs(dep + 1)) return 1; h[i] += 3; } for(int i=0;i<=24;i++) if(i % 9 <= 6 && h[i] >= 1 && h[i+1] >= 1 && h[i+2] >= 1) { if(dep == 3) return 1; h[i]--;h[i+1]--;h[i+2]--; if(dfs(dep + 1)) return 1; h[i]++;h[i+1]++;h[i+2]++; } return 0; } bool check() { for(int i=0;i<34;i++) { if(h[i] >= 2) { h[i] -= 2; if(dfs(0)) return 1; h[i] += 2; } } return 0; } int solve() { int flag = 0; for(int i=0;i<34;i++) { memset(h , 0 , sizeof(h)); for(int j=0;j<13;j++) h[C[j]]++; if(h[i] >= 4) continue; h[i]++; if(check()) { flag = 1; cout<<' '<<card[i]; } h[i]--; } if(!flag) printf(" Not ready"); printf("\n"); } int main() { string str; int kcase = 1; while(cin>>str && str != "0") { S[0] = str;C[0] = id(str); for(int i = 1;i<13;i++) { cin>>S[i]; C[i] = id(S[i]); } printf("Case %d:",kcase++); solve(); } return 0; }
时间: 2024-12-24 10:10:03