题目描述
两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。
游戏规则:
共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 <string> //在vs2010里面必须包含进来
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void convertNum(string s1,string s2,vector<int> &i1,vector<int> &i2){ //将字符串转换为整数
int len1=s1.length(); //转换字符串1
for(int i=0;i<len1;i++){
if(s1[i]!='1'){ //如果字符不为1
if(s1[i]=='J'){
i1.push_back(11);
}else if(s1[i]=='Q'){
i1.push_back(12);
}else if(s1[i]=='K'){
i1.push_back(13);
}else if(s1[i]=='A'){
i1.push_back(14);
}else{
int num=s1[i]-'0';
i1.push_back(num);
}
}else{ //如果字符为1 则分两种情况进行讨论
if((i+1)<len1){ //判断是否超过长度
if(s1[i+1]=='0'){ //判断后面一个字符是否为0
i1.push_back(10);
i++; //跳过一个字符
}else{
i1.push_back(1);
}
}else{
i1.push_back(1);
}
}
}
int len2=s2.length(); //转换字符串2
for(int i=0;i<len2;i++){
if(s2[i]!='1'){
if(s2[i]=='J'){
i2.push_back(11);
}else if(s2[i]=='Q'){
i2.push_back(12);
}else if(s2[i]=='K'){
i2.push_back(13);
}else if(s2[i]=='A'){
i2.push_back(14);
}else{
int num=s2[i]-'0';
i2.push_back(num);
}
}else{ //如果字符为1 则分两种情况进行讨论
if((i+1)<len2){ //判断是否超过长度
if(s2[i+1]=='0'){ //判断后面一个字符是否为0
i2.push_back(10);
i++; //跳过一个字符
}else{
i2.push_back(1);
}
}else{
i2.push_back(1);
}
}
}
}
void printvector(vector<int> v){ //打印向量
for(int i=0;i<v.size();i++){
cout<<v[i]<<" ";
}
cout<<endl;
}
bool inputCheck(vector<int> v){ //输入合法性检查
if(v.size()==3){ //数据大小检查
for(int i=0;i<2;i++){ //数据范围检查
if(v[i]>14||v[i]<2)
return false;
}
return true;
}else
return false;
}
int paiXing(vector<int> v){ //牌型判断
if(v[0]==v[1]&&v[2]==v[0]) //豹子
return 4;
sort(v.begin(),v.end()); //进行一次排序
if(v[0]+1==v[1]&&v[1]+1==v[2]){ //顺子
return 3;
}
if(v[0]==v[1]||v[1]==v[2]||v[0]==v[2]) //对子
return 2;
return 1; //普通牌型
}
int main(){
string s1,s2;
while(cin>>s1>>s2){
vector<int> i1;
vector<int> i2;
convertNum(s1,s2,i1,i2); //字符串转换为整数
if(inputCheck(i1)&&inputCheck(i2)){ //输入合法性检查
int p1=paiXing(i1);
int p2=paiXing(i2);
if(p1==p2){ //牌型相同的情况下进行比较
if(p1>1){ //如果是特殊牌型
if(p1==4){ //如果是豹子
if(i1[0]>i2[0]) //只需比较第一个数
cout<<"1"<<endl;
else if(i1[0]<i2[0])
cout<<"-1"<<endl;
else
cout<<"0"<<endl;
}else if(p1==3){ //如果是顺子
sort(i1.begin(),i1.end()); //先进行排序
sort(i2.begin(),i2.end());
if(i1[2]>i2[2]) //比较最后一个元素
cout<<"1"<<endl;
else if(i1[2]<i2[2])
cout<<"-1"<<endl;
else
cout<<"0"<<endl;
}else{ //如果是对子
int num1,n1,num2,n2;
if(i1[0]==i1[1]){ //取出对子和单数
num1=i1[0];
n1=i1[2];
}else if(i1[0]==i1[2]){
num1=i1[0];
n1=i1[1];
}else{
num1=i1[1];
n1=i1[0];
}
if(i2[0]==i2[1]){
num2=i2[0];
n2=i2[2];
}else if(i2[0]==i2[2]){
num2=i2[0];
n2=i2[1];
}else{
num2=i2[1];
n2=i2[0];
}
if(num1>num2){ //顺子比较
cout<<"1"<<endl;
}else if(num1<num2){
cout<<"-1"<<endl;
}else{
if(n1>n2)
cout<<"1"<<endl;
else if(n1<n2)
cout<<"-1"<<endl;
else
cout<<"0"<<endl;
}
}
}else{ //如果是普通牌型
sort(i1.begin(),i1.end()); //先进行排序
sort(i2.begin(),i2.end());
int j;
for(j=2;j>=0;j--){
if(i1[j]!=i2[j]){
if(i1[j]>i2[j])
cout<<"1"<<endl;
else
cout<<"-1"<<endl;
break;
}
}
if(j<0){
cout<<"0"<<endl;
}
}
}else{ //牌型不同的情况下进行比较
if(p1>p2)
cout<<"1"<<endl;
else if(p1<p2)
cout<<"-1"<<endl;
else
cout<<"0"<<endl;
}
}else{
cout<<"-2"<<endl; //输出不合法
}
}
system("pause");
}