搜狐笔试题:扎金花

 两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。

游戏规则:
共52张普通牌,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张; 每人抓三张牌。两人比较手中三张牌大小,大的人获胜。 

对于牌型的规则如下: 
1.三张牌一样即为豹子 
2.三张牌相连为顺子(A23不算顺子) 
3.有且仅有两张牌一样为对子 豹子>顺子>对子>普通牌型 在牌型一样时,比较牌型数值大小(如AAA>KKK,QAK>534,QQ2>10104) 在二人均无特殊牌型时,依次比较三张牌中最大的。大的人获胜,如果最大的牌一样,则比较第二大,以此类推(如37K>89Q) 如二人牌面相同,则为平局。 


输入描述:
输入两个字符串代表两个玩家的牌(如"10KQ" "354"),先输入的作为玩家1,后输入的作为玩家2


输出描述:
1 代表 玩家1赢 0 代表 平局 -1 代表 玩家2赢 -2 代表不合法的输入

输入例子:
KQ3 3Q9
10QA 6102
5810 7KK
632 74J
10102 K77
JKJ 926
68K 27A

输出例子:

1
1
-1
-1
1
1
-1

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>

using namespace std;

vector<int> str2nums(string str){//字符串转整型数组
	vector<int> nums;

	int i = 0;
	while(i<str.length()){
		if(str[i] == '1'){
			nums.push_back(10);
			i += 2;
		}
		else{
			if(str[i] == 'J')
				nums.push_back(11);
			else if(str[i] == 'Q')
				nums.push_back(12);
			else if(str[i] == 'K')
				nums.push_back(13);
			else if(str[i] == 'A')
				nums.push_back(14);
			else if(str[i] >= '2' && str[i] <= '9')
				nums.push_back(str[i] - '0');
			else
				nums.push_back(-1);//非法输入
			i++;
		}
	}

	sort(nums.begin(), nums.end());

	return nums;
}

int getCot(vector<int>& nums){//获取牌面类型,1-4分别代表不同牌面
	if(nums[0] == nums[1] && nums[1] == nums[2])//豹子
		return 1;
	else if(nums[0]+1 == nums[1] && nums[1]+1 == nums[2])//顺子
		return 2;
	else if(nums[0] ==nums[1] || nums[1] == nums[2])//对子
		return 3;
	else//单牌
		return 4;
}

int comp(vector<int>& nums1, vector<int>& nums2){//比较大小
	int cot1, cot2;

	cot1 = getCot(nums1);
	cot2 = getCot(nums2);

	if(cot1 < cot2)
		return 1;
	else if(cot2 > cot2)
		return -1;
	else{
		if(cot1 == 1 || cot1 == 2){
			if(nums1[0] > nums2[0])
				return 1;
			else if(nums1[0] < nums2[0])
				return -1;
			else
				return 0;
		}
		else if(cot1 == 3){
			int pair1 = nums1[0];
			if(nums1[0] != nums1[1] && nums1[0] != nums1[2])
				pair1 = nums1[1];
			int pair2 = nums2[0];
			if(nums2[0] != nums2[1] && nums2[0] != nums2[2])
				pair2 = nums2[1];
			if(pair1 > pair2)
				return 1;
			else if(pair1 < pair2)
				return -1;
			else
				return 0;
		}
		else{
			for(int i=2; i>=0; i--){
				if(nums1[i] > nums2[i])
					return 1;
				else if(nums1[i] < nums2[i])
					return -1;
			}
			return 0;
		}
	}
}

int fun(){
	string str1, str2;
	cin>>str1;
	if(str1 == "EOF")//输入终止
		return -1;
	cin>>str2;

	vector<int> nums1, nums2;

	nums1 = str2nums(str1);
	nums2 = str2nums(str2);

	//非法输入
	if(nums1.size()!=3 || nums2.size()!=3){
		cout<<-2<<endl;
		return 0;
	}
	for(int i=0; i<3; i++){
		if(nums1[i] == -1 || nums2[i] == -1){
			cout<<-2<<endl;
			return 0;
		}
	}

	int res = comp(nums1, nums2);

	cout<<res<<endl;

	return 0;
}

int main(){
	while(1)
		if(fun() != 0)
			break;
	return 0;
}


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值