大白书第一章的例题,当时看起来很吃力,现如今A这道题的话怎么写都无所谓了。
思路很简单,就是枚举胡哪张牌,然后枚举一下将牌,剩下如果能找到4个顺子或者刻子就胡了。
由于粗心,34个字符串初始化写错,各种WA。
1 #include <cstdio> 2 #include <cstring> 3 #include <string> 4 #include <iostream> 5 using namespace std; 6 7 int a[13], c[34]; 8 string s; 9 10 string mahjong[34] = { "1T", "2T", "3T", "4T", "5T", "6T", "7T", "8T", "9T", 11 "1S", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S", 12 "1W", "2W", "3W", "4W", "5W", "6W", "7W", "8W", "9W", 13 "DONG", "NAN", "XI", "BEI", "ZHONG", "FA", "BAI" }; 14 15 int ID(string& maj) 16 { 17 for(int i = 0; i < 34; i++) 18 if(mahjong[i] == maj) return i; 19 return -1; 20 } 21 22 bool dfs(int d) 23 { 24 if(d == 4) return true; 25 for(int i = 0; i < 34; i++) if(c[i] >= 3) 26 { 27 c[i] -= 3; 28 if(dfs(d + 1)) return true; 29 c[i] += 3; 30 } 31 for(int i = 0; i <= 24; i++) if(i % 9 <= 6 && c[i] && c[i + 1] && c[i + 2]) 32 { 33 c[i] -= 1; c[i + 1] -= 1; c[i + 2] -= 1; 34 if(dfs(d + 1)) return true; 35 c[i] += 1; c[i + 1] += 1; c[i + 2] += 1; 36 } 37 return false; 38 } 39 40 bool check() 41 { 42 for(int i = 0; i < 34; i++) if(c[i] >= 2) 43 { 44 c[i] -= 2; 45 if(dfs(0)) return true; 46 c[i] += 2; 47 } 48 return false; 49 } 50 51 int main() 52 { 53 freopen("in.txt", "r", stdin); 54 55 int kase = 0; 56 while(cin >> s) 57 { 58 if(s[0] == '0') break; 59 printf("Case %d:", ++kase); 60 61 a[0] = ID(s); 62 for(int i = 1; i <= 12; i++) { cin >> s; a[i] = ID(s); } 63 64 bool ok = false; 65 for(int i = 0; i < 34; i++) 66 { 67 memset(c, 0, sizeof(c)); 68 for(int j = 0; j < 13; j++) c[a[j]]++; 69 if(c[i] >= 4) continue; 70 c[i]++; 71 if(check()) 72 { 73 ok = true; 74 printf(" %s", mahjong[i].c_str()); 75 } 76 } 77 if(!ok) printf(" Not ready"); 78 printf("\n"); 79 } 80 81 return 0; 82 }