搜狐笔试题之扎金花
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜狐笔试题之扎金花相关的知识,希望对你有一定的参考价值。
题目描述:
共52张牌,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A,大小递增,各四张;每人抓三张牌。两人比较手中三张牌大小,大的人获胜
牌型如下:
三张一样的为豹子
三张牌相连为顺子(A23不算)
有且仅有两张牌一样为对子
豹子>顺子>对子>普通牌型
在比较牌型数值大小时(如AAA>KKK,QAK>534,QQ2>10104)在二人均无特殊牌型时,依次比较三张牌中最大的,大的人获胜,若最大的牌一样,则比较第二大,以此类推
若两人牌面相同,则为平局(draw)
输入描述:
输入两个字符串代表玩家的牌,先输入的作为玩家1,后输入的作为玩家2
输出描述:
player1 win! player2 win! bad input!(非法输入) a draw!(平局)
其实仔细一想,这道题就是一个比较复杂的分类讨论,我的思路是将会出现的13张牌由小到大存储在一个字符串数组card中,先将输入的字符串分离成独立的字符串,再看它们是否合法,
再就是把这些独立的字符串在card中对应的下标存储在一个数组中,sort这个数组后,再对它分级,若为豹子,则为4级,其他的依次下降。
具体实现,感觉不是很难,在此就略过了!下面上代码!
1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 #include<vector> 5 6 using namespace std; 7 8 const int m = 3; 9 const int n = 13; 10 string card[n] = {"2", "3", "4", "5", 11 "6", "7", "8", "9", "10", 12 "J", "Q", "K", "A"}; 13 14 int isValid(string s) 15 { 16 for(int i = 0; i < n; ++i) 17 { 18 if(card[i] == s) 19 { 20 return i; 21 } 22 } 23 return -1; 24 } 25 26 vector<int> sort(string player) 27 { 28 vector<int> v; 29 string tmp; 30 int value = -1; 31 for(int i = 0; i < player.size(); ++i) 32 { 33 tmp += player[i]; 34 if(player[i + 1] == ‘0‘) 35 tmp += player[++i]; 36 if((value = isValid(tmp)) != -1) 37 { 38 v.push_back(value); 39 tmp.clear(); 40 } 41 } 42 43 sort(v.begin(), v.end()); 44 return v; 45 } 46 47 int Rank(vector<int>& player) 48 { 49 int player_rank = 1; //普通牌型 50 51 if(player[0] == player[1] && player[1] == player[2]) 52 player_rank = 4; //豹子 53 else if(player[0] + 1 == player[1] && player[1] + 1 == player[2]) 54 player_rank = 3; //顺子 55 else if(player[0] == player[1] || player[1] == player[2]) 56 player_rank = 2; //对子 57 58 return player_rank; 59 } 60 61 int cmp(vector<int>& player1, vector<int> player2) 62 { 63 int player1_rank = Rank(player1); 64 int player2_rank = Rank(player2); 65 66 if(player1_rank > player2_rank) 67 { 68 return 1; 69 } 70 else if(player1_rank == player2_rank) 71 { 72 if(player1_rank != 2) 73 { 74 if(player1[2] > player2[2]) 75 { 76 return 1; 77 } 78 else if(player1[2] == player2[2]) 79 { 80 if(player1[1] == player2[1]) 81 { 82 if(player1[0] == player2[0]) 83 { 84 return 0; 85 } 86 else if(player1[0] > player2[0]) 87 { 88 return 1; 89 } 90 else 91 { 92 return -1; 93 } 94 } 95 else if(player1[1] > player2[1]) 96 { 97 return 1; 98 } 99 else 100 { 101 return -1; 102 } 103 } 104 else 105 { 106 return -1; 107 } 108 } 109 else 110 { 111 if(player1[1] == player2[1]) 112 { 113 if(player1[0] == player2[0]) 114 { 115 if(player1[2] == player2[2]) 116 { 117 return 0; 118 } 119 else if(player1[2] > player2[2]) 120 { 121 return 1; 122 } 123 else 124 { 125 return -1; 126 } 127 } 128 else if(player1[0] > player2[0]) 129 { 130 return 1; 131 } 132 else 133 { 134 return -1; 135 } 136 } 137 else if(player1[1] > player2[1]) 138 { 139 return 1; 140 } 141 else 142 { 143 return -1; 144 } 145 } 146 } 147 else 148 { 149 return -1; 150 } 151 } 152 153 int main() 154 { 155 string player1, player2; 156 157 cout << "输入player1 player2的牌:\\n"; 158 while(cin >> player1 >> player2) 159 { 160 vector<int> pv1 = sort(player1); 161 vector<int> pv2 = sort(player2); 162 163 if(pv1.size() == m && pv2.size() == m) 164 { 165 int result = cmp(pv1, pv2); 166 if(result == 1) 167 { 168 cout << "player1 win!\\n"; 169 } 170 else if(result == 0) 171 { 172 cout << "a draw!\\n"; 173 } 174 else if(result == -1) 175 { 176 cout << "player2 win!\\n"; 177 } 178 } 179 else 180 { 181 cout << "bad input!\\n"; 182 } 183 cout << "输入玩家1 玩家2的牌:\\n"; 184 } 185 186 return 0; 187 }
以上是关于搜狐笔试题之扎金花的主要内容,如果未能解决你的问题,请参考以下文章