华为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机试题库#