华为od题库 斗地主之顺子
题目描述:
- 在斗地主扑克牌游戏中, 扑克牌由小到大的顺序为:3,4,5,6,7,8,9,10,J,Q,K,A,2,
- 玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。
- 其中顺子的出牌规则为:由 至少 5 张由小到大连续递增 的扑克牌组成,且 不能包含 2 。
- 例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,10,J,Q,K,A}都是有效的顺子;
- 而{J,Q,K,A,2}、 {2,3,4,5,6}、{3,4,5,6}、{3,4,5,6,8}等都不是顺子。
- 给定一个包含13张牌的数组,如果有满足出牌规则的顺子,请输出顺子。
- 如果存在多个顺子,请每行输出一个顺子,且需要按顺子的 第一张牌的大小(必须从小到大) 依次输出。
- 如果没有满足出牌规则的顺子,请 输出 No 。
在斗地主扑克牌游戏中, 扑克牌由小到大的顺序为:3,4,5,6,7,8,9,10,J,Q,K,A,2,
玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。
其中顺子的出牌规则为:由 至少 5 张由小到大连续递增 的扑克牌组成,且 不能包含 2 。
例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,10,J,Q,K,A}都是有效的顺子;
而{J,Q,K,A,2}、 {2,3,4,5,6}、{3,4,5,6}、{3,4,5,6,8}等都不是顺子。
给定一个包含13张牌的数组,如果有满足出牌规则的顺子,请输出顺子。
如果存在多个顺子,请每行输出一个顺子,且需要按顺子的 第一张牌的大小(必须从小到大) 依次输出。
如果没有满足出牌规则的顺子,请 输出 No 。
//主要思想:将字符转化为对应整数方便排序,利用哈希表存储每一种牌的个数,搜索顺子过程中只要在哈希表种找连续的不为0的数组下标即可,满足大于等于五即可输出。
//菜鸡新人求斧正
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
// 数变字符
string num_to_card(int a)
{
if(a>=3&&a<=10) return to_string(a);
else if(a==11) return "J";
else if(a==12) return "Q";
else if(a==13) return "K";
else if(a==14) return "A";
else if(a==15) return "2";
}
int main()
{
vector<string> a(13);
vector<int> num(13);
int hash[16]={0}; //初始化哈希表
for(int i=0;i<13;i++) //处理输入 将字符变成数存入num数组
{
cin>>a[i];
if(a[i]=="J") num[i]=11;
else if(a[i]=="Q") num[i]=12;
else if(a[i]=="K") num[i]=13;
else if(a[i]=="A") num[i]=14;
else if(a[i]=="2") num[i]=15;
else if(a[i]=="10") num[i]=10;
else if(a[i]>="3"&&a[i]<="9") num[i]=a[i][0]-'3'+3;
}
sort(num.begin(),num.end()); //排序
for(int x:num) hash[x]++; //用哈希表计数每种牌的个数
int l=3,r,count1=0; //双指针遍历hash
while(r<15)
{
while(hash[l]==0) l++;
r=l;
while(hash[r]&&r<15) r++; //r不能越界
if(r-l>=5)
{
count1++;
for(int i=l;i<r;i++) //检测到符合条件的顺子就输出
{
cout<<num_to_card(i)<<' ';
hash[i]--;
}
cout<<endl;
continue; //输出后从l检测,避免重复情况,比如两队相同顺子
}
l=r; //没有满足的顺子就更新l指针(挺像快慢指针的)
}
if(!count1) cout<<"no"<<endl; //检测完后如果没有输出就说明没有顺子
}
#od机试题库#
查看3道真题和解析