搜狐笔试题之扎金花

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 }

技术分享

 

技术分享

技术分享

以上是关于搜狐笔试题之扎金花的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer——当当+搜狐+好未来笔试题+知识点总结

数据挖掘搜狐公司数据挖掘工程师笔试题

JavaScript笔试题(js高级代码片段)

数据挖掘2022年2023届秋招Kanaries雾角科技算法岗 笔试题

IT笔试题

经典PHP笔试题