华为机试-麻将胡牌

    xiaoxiao2021-03-25  60

    /*************************华为机试-麻将胡牌*********************************** * XSH/2017/3/14 *前景: *说起麻将,那可是川渝市民的最爱,无论亲朋好友聚会,还是业务谈判,总是少不了麻将的声音。 *成都麻将只能包括3种类型:条,筒,万。没有“门、东南西北、红中”。每种牌都是数字从1到9, *每个数字有4张,共36张。筒,万,条均一样。 *胡牌规则: *1.必须有一个对子,即两张相同的牌,比如:两个2筒,两个4条等。 *2.剩余的牌,每3张需要凑成一个有效牌,比如:3个一样的牌(3个2筒),或者3个顺子(1条2条3条),如果所有的牌都能够凑好,再满足规则2和1,有一个对子,并且所有的牌只有两种类型,那么就可以胡牌了。 *3.假设牌不会出现碰的情况,即输入的牌肯定是13张。 *4.输入牌肯定都是麻将牌,不用考虑异常输入;也不用考虑会输入“门”,“红中”等成都麻将中不会出现的牌。 *5.条用T表示,D用D表示,万用W标识。 *6.不用考虑输入的合法性,这个由函数的使用者保证。输入的牌为字符串,字母为大写的TDW” * *输入:输入13张麻将牌,如”1T8T6W6W5D4W1T3W6W2W5D6T1T” * *输出:输出胡牌个数和要胡的牌,其中胡牌个数占一行输出,胡哪一张牌占一行输出,胡多张牌,输出数促按 *照T / D / W的顺序从小到大排列(如1T5T6D7D3W8W)。 *1 *7T * *输入样例:1T8T6W6W5D4W1T3W6W2W5D6T1T * *输出样例: *1 *7T ******************************************************************************/ #include<iostream> #include<string> #include<vector> using namespace std; bool huPai(vector<int>& pai, int n) { if (0 == n) return true; if (n % 3 == 2)//选将 { for (int i = 0; i < 27; ++i) { if (pai[i] >= 2) { pai[i] -= 2; if (huPai(pai, n - 2)) return true; pai[i] += 2; } } } else { for (int i = 0; i < 27; ++i)//三张(一门) { if (pai[i] >= 3) { pai[i] -= 3; if (huPai(pai, n - 3)) return true; pai[i] += 3; } } for (int i = 0; i<25; ++i)//顺子 { if (pai[i]>0 && pai[i + 1] > 0 && pai[i + 2] > 0 && (i < 7 || i<16 && i >= 9 || i >= 18 && i<25)) { pai[i] -= 1; pai[i + 1] -= 1; pai[i + 2] -= 1; if (huPai(pai, n - 3)) return true; pai[i]+=1; pai[i + 1] += 1; pai[i + 2] += 1; } } } return false; } bool huPai(vector<int>& pai) { return huPai(pai, 14); } void help(string in, int& num, string& out) { num = 0; vector<int> pai(27, 0); vector<int> tmp(27,0); for (int i = 0; i < in.size() - 1; i += 2) { if (in[i + 1] == 'T') ++pai[in[i] - '0' - 1]; else if (in[i + 1] == 'D') ++pai[in[i] - '0' + 8]; else ++pai[in[i]-'0'+17]; } for (int i = 0; i < 27; ++i) { if (pai[i] < 4) { pai[i]++; for (int j = 0; j<27; j++) tmp[j] = pai[j]; bool flag = huPai(tmp); if (flag){ num++; if (i<9){ out += (i + 1 + '0'); out += 'T'; } else if (i<18){ out += (i % 9 + 1 + '0'); out += 'D'; } else if (i<27){ out += (i % 9 + 1 + '0'); out += 'W'; } } pai[i]--; } } } int main(){ string in, out; int out_num; cin >> in; help(in, out_num, out); if (out.empty()){ cout << endl; cout << endl; } else{ cout << out_num << endl; cout << out << endl; } system("pause"); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-50062.html

    最新回复(0)