华为机试-麻将胡牌

来源:互联网 发布:部落冲突7本建筑数据 编辑:程序博客网 时间:2024/04/28 03:11
/*************************华为机试-麻将胡牌*********************************** *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;}

0 0