大白书第一章的例题,当时看起来很吃力,现如今A这道题的话怎么写都无所谓了。
思路很简单,就是枚举胡哪张牌,然后枚举一下将牌,剩下如果能找到4个顺子或者刻子就胡了。
由于粗心,34个字符串初始化写错,各种WA。
1 #include2 #include 3 #include 4 #include 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 }