华为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机试题库#
全部评论

相关推荐

1 2 评论
分享
牛客网
牛客企业服务