搜狐笔试题之扎金花

题目描述:

共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 }

时间: 2024-12-14 06:46:49

搜狐笔试题之扎金花的相关文章

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

剑指Offer--当当+搜狐+好未来笔试题+知识点总结 情景回顾 时间:2016.9.21 15:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:当当笔试.搜狐笔试.好未来笔试 3场笔试中好未来相对简单点. 好未来编程题 马踏棋盘(贪心算法) ??马踏棋盘是经典的程序设计问题之一,主要的解决方案有两种:一种是基于深度优先搜索的方法,另一种是基于贪婪算法的方法.第一种基于深度优先搜索(DFS)的方法是比较常用的算法,深度优先搜索算法也是数据结构中的经典算法之一,主要是采用递归的

[编程题-搜狐]扎金花

[编程题] 扎金花 两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 . 游戏规则: 共52张普通牌,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张: 每人抓三张牌.两人比较手中三张牌大小,大的人获胜. 对于牌型的规则如下: 1.三张牌一样即为豹子 2.三张牌相连为顺子(A23不算顺子) 3.有且仅有两张牌一样为对子 豹子>顺子>对子>普通牌型 在牌型一样时,比较牌型数值大小(如AAA>KKK,QAK>534,QQ2

面试题:搜狐百度 !=!=未看

本人是做java开发的,这是我参加58,搜狐,搜狗,新浪微博,百度,腾讯文学,网易以及其他一些小的创业型公司的面试常被问的问题,当然有重复,弄清楚这些,相信面试会轻松许多. 1. junit用法,before,beforeClass,after, afterClass的执行顺序2. 分布式锁3. nginx的请求转发算法,如何配置根据权重转发4. 用hashmap实现redis有什么问题(死锁,死循环,可用ConcurrentHashmap)5. 线程的状态5. 线程的阻塞的方式6. sleep

搜狐2016研发工程师编程题

1.[编程题]马戏团 搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演.考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等. 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题.小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列.

2017校招运维岗总结(腾讯+百度+京东+华为+中兴+小米+58+平安科技+搜狐+航天三院+Others)

先总结一下面试过的公司吧,可以为后人选择公司作为参考 前面是我对各公司的评价,不想看的可以直接拉到后面   最寒心的: 腾讯 内推的时候问六级过了吗,没过能毕业吗? 然后聊了10分钟项目就挂了 : )    校招的时候,笔试完了状态直接变成了面试未通过 最糟心的: 百度 内推死于二面,技不如人,甘拜下风    校招死于三面,据说百度今年在哈尔滨只招了15人,而且我也有点作死,投的岗位全国招15个  死于三面不甘心啊 最闹心的: 京东 京东直接校招,然后9月8号发短信让9月10号去北京面试,9月9

【搜狐】【实习】【现场面试】【JAVA工程师】2018.03.14

13:30-16:30  从学校出发到返回学校,一共3小时 今年实习第一面,面完估计要凉 先简单说一下经历: 中午赖在床上不想起来,发现自己还是在逃避,逃避面试.逃避现实,磨叽着磨叽着最后迟到了,HR给我打了2个电话,弄得我很尴尬.找到搜狐大厦之后,匆匆忙忙地上电梯,结果一到20层,我就想上厕所,想想其实挺惭愧的,来别人公司还没进行任何交流,就留下一堆排泄物,好像很不道德. HR把我带到茶水间,这也是个小会议室,前后左右都是正在进行的面试,有电话面试,有校招.有社招.等待期间我旁听了一个大叔面试

Java工程师笔试题整理[校招篇]

隔着两个月即将开始校招了.你是不是也想借着这个机会崭露头角,拿到某些大厂的offer,赢取白富美.走上人生巅峰?当然如果你还没能打下Java基础,一定要先打好Java基础:如何一步一步的学Java - 学习编程 - 知乎专栏.然后再来看一下练习一下各大厂的面试笔试题目. 如果以下内容满足不了你,你还可以去看这篇: 2016校招编程题汇总 - 学习编程 - 知乎专栏 进入主要内容(主要内容整理来自牛客网:牛客网)(以下内容按照各大公司进行划分,对每一公司按照年份进行划分,如果想想下载以下内容,可以

送上今年微软的一道笔试题

这里送上一道微软的笔试题,具体题目如下: Time Limit: 10000msCase Time Limit: 1000msMemory Limit: 256MB Description Consider a string set that each of them consists of {0, 1} only. All strings in the set have the same number of 0s and 1s. Write a program to find and outp

网易2017秋招笔试题3:最长公共子括号序列长度

[问题来源]网传的2017网易秋招笔试题 [问题描述] [算法思路] 下面的解题思路摘自  http://www.cnblogs.com/Atanisi/p/7500186.html 刚看到题我就想到暴力解,深搜出所有合法的括号序列,再依次比较公共子序列的长度,返回最长的.但是深搜一般和路径有关,这道题仅仅需要最大公共子序列的长度.而我们发现最大公共子序列的长度就是 s.size() - 1(当且仅当修改距离为 1 时 LCS 最大), 那么我们就想到,可以变换 s 中一个括号的位置,枚举所有的