首页 > 试题广场 >

扎金花

[编程题]扎金花
  • 热度指数:3536 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
 两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。 游戏规则: 共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 代表不合法的输入
示例1

输入

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

输出

1 1 -1 -1 1 1 -1
import java.util.Arrays;
import java.util.Scanner;

public class Main { 
	
	public static void main(String args[]){		 
		 Scanner cin = new Scanner(System.in);	    	 	
	     while(cin.hasNext()){
   	 
	    	 int n = cin.nextInt();
	    	 String str[][] = new String[n][2];
	    	 for(int i = 0;i < n;i++){
	    		 str[i][0] = cin.next();
	    		 str[i][0] = str[i][0].replace("1", "");
	    		 str[i][1] = cin.next();
	    		 str[i][1] = str[i][1].replace("1", "");
	    		 int person1[] = chartoInt(str[i][0]);
	    		 int person2[] = chartoInt(str[i][1]);
	    		 Arrays.sort(person1);
	    		 Arrays.sort(person2);
	    		 int res = compare(person1,person2);
	    		 System.out.println(res);
	    	 }	    	 

	     }			 			 
	}

	private static int compare(int[] person1, int[] person2) {
		// TODO Auto-generated method stub
		int res = 0;
		int remark1,remark2;
		if(person1[2]-person1[0] == 0)
			remark1 = 3;
		else if(person1[2] == person1[1] ||person1[0] == person1[1])
			remark1 = 1;
		else if(person1[2]-person1[0] == 2)
			remark1 = 2;
		else
			remark1 = 0;
		
		if(person2[2]-person2[0] == 0)
			remark2 = 3;
		else if(person2[2] == person2[1] ||person2[0] == person2[1])
			remark2 = 1;
		else if(person2[2]-person2[0] == 2)
			remark2 = 2;
		else
			remark2 = 0;
		
		
		if(remark1 > remark2){
			return 1;
		}else if(remark1 < remark2){
			return -1;
		}else{ 
			if(remark1 == 3 || remark1 == 2){ //两副牌都是豹子或者顺子
				if(person1[0] > person2[0]){
					return 1;
				}else if(person1[0] < person2[0]){
					return -1;
				}else
					return 0;
			}else if(remark1 == 1){ //两副牌是都是对子
				if(person1[1] > person2[1]){
					return 1;
				}else if(person1[1] < person2[1]){
					return -1;
				}else{
					if(person1[0] > person2[0])
						return 1;
					else if(person1[0] < person2[0])
						return -1;
					else{
						if(person1[2] > person2[2])
							return 1;
						else if(person1[2] < person2[2])
							return -1;
						else
							return 0;
					}
				}					
			}else{  //两副牌都是普通牌
				if(person1[2] > person2[2])
					return 1;
				else if(person1[2] < person2[2])
					return -1;
				else{
					if(person1[1] > person2[1])
						return 1;
					else if(person1[1] < person2[1])
						return -1;
					else{
						if(person1[0] > person2[0])
							return 1;
						else if(person1[0] < person2[0])
							return -1;
						else
							return 0;
					}
				}
			}
		}
		
	}

	private static int[] chartoInt(String str) {
		// TODO Auto-generated method stub
		int res[] = new int[3];
		for(int i = 0;i < 3;i++){
			switch(str.charAt(i)){
			case('2'): res[i] = 2;break;
			case('3'): res[i] = 3;break;			
			case('4'): res[i] = 4;break;
			case('5'): res[i] = 5;break;
			case('6'): res[i] = 6;break;
			case('7'): res[i] = 7;break;
			case('8'): res[i] = 8;break;
			case('9'): res[i] = 9;break;
			case('0'): res[i] = 10;break;
			case('J'): res[i] = 11;break;
			case('Q'): res[i] = 12;break;
			case('K'): res[i] = 13;break;
			case('A'): res[i] = 14;break;	
			default: break;
			}
		}
		return res;
	}
}

发表于 2016-05-22 09:16:46 回复(0)
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		while (scan.hasNextLine()) {
			String s1 = scan.next();
			String s2 = scan.next();
			char[] c1 = s1.trim().replaceAll("0", "").toCharArray();
			char[] c2 = s2.trim().replaceAll("0", "").toCharArray();
			scan.nextLine();
           // try{
                System.out.println(new Main().new pai(c1).compareTo(new Main().new pai(c2)));
            //}catch(Exception e){
             //   System.out.println(-2);
                
           // }
		}
	}

	class pai implements Comparable<pai> {
		private final static int BAO = 3;
		private final static int SHUN = 2;
		private final static int DUI = 1;
		private final static int PU = 0;
		private final static int LO = 10;
		private final static int J = 11;
		private final static int Q = 12;
		private final static int K = 13;
		private final static int A = 14;
		private int rank;
		private int[] sanpai;
		private char[] stringPai;

		public pai(char[] c1) {
			stringPai = c1;
			sanpai = digitPai();
			SortPai();
			setRank();
		}

		private int[] digitPai() {
			sanpai = new int[stringPai.length];
			for (int i = 0; i < stringPai.length; i++) {
				if (stringPai[i] == '1')
					sanpai[i] = 10;
				else if (stringPai[i] == 'J' || stringPai[i] == 'j')
					sanpai[i] = 11;
				else if (stringPai[i] == 'K' || stringPai[i] == 'k')
					sanpai[i] = 13;
				else if (stringPai[i] == 'Q' || stringPai[i] == 'q')
					sanpai[i] = 12;
				else if (stringPai[i] == 'a' || stringPai[i] == 'A')
					sanpai[i] = 14;
				else
					sanpai[i] = Integer.parseInt("" + stringPai[i]);
			}
			return sanpai;
		}

		private void setRank() {
			if (sanpai[0] == sanpai[1] && sanpai[0] == sanpai[2])
				rank = BAO;
			else if (sanpai[0] != sanpai[1] && sanpai[1] != sanpai[2])
				rank = PU;
			else if (sanpai[0] - 1 == sanpai[1] && sanpai[1] - 1 == sanpai[2])
				rank = SHUN;
			else
				rank = DUI;

		}

		public int[] getSanpai() {
			return sanpai;
		}

		public int getRank() {
			return rank;

		};

		private void SortPai() {
			for (int i = 0; i < sanpai.length; i++)
				for (int j = i + 1; j < sanpai.length; j++) {
					if (sanpai[i] < sanpai[j]) {
						sanpai[i] = sanpai[i] ^ sanpai[j];
						sanpai[j] = sanpai[i] ^ sanpai[j];
						sanpai[i] = sanpai[i] ^ sanpai[j];
					}
				}

		};

		public int compareTo(pai o) {
			if (this.getRank() > o.getRank())
				return 1;
			else if (this.getRank() < o.getRank())
				return -1;
			else
				for (int i = 0; i < sanpai.length; i++) {
					if (sanpai[i] > o.getSanpai()[i])
						return 1;
					else if (sanpai[i] < o.getSanpai()[i])
						return -1;
				}
			// if()
			return 0;
		}
	}

}


发表于 2016-11-20 22:42:18 回复(0)
OJ 测试有问题!

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

map<char,int> keep{{'J',11}, {'Q',12}, {'K',13}, {'A',14}};

bool convert(const string &a, vector<int> &player){
    int i=0;
    while(i < a.size()){
        char c = a[i];
        if(keep.find(c)!=keep.end()){
            player.push_back(keep[c]);
        }
        else if(c >= '2' && c <= '9'){
            player.push_back(c-'0');
        }
        else if(c == '1' && a[i+1] == '0'){
            player.push_back(10);
            i++;
        }
        else{
            return false;
        }
        i++;
    }
    if(player.size() != 3){
        return false;
    }
    sort(player.begin(), player.end());
    return true;
}

int type(const vector<int>& play){
    // 豹子: 4
    if(play[0] == play[1] && play[1] == play[2]){
        return 4;
    }

    // 顺子: 3      234 456 ... JQK QKA KA2
    if((play[0]+1==play[1] && play[1]+1==play[2]) || (play==vector<int>{2,13,14})){
        return 3;
    }

    // 对子: 2
    if(play[0] == play[1] || play[1] == play[2]){
        return 2;
    }

    // 普通: 1
    return 1;
}

int main(){
    string a, b;
    while(cin >> a >> b){
        vector<int> play_1;
        vector<int> play_2;
        if(!convert(a, play_1) || !convert(b, play_2)){
            cout << -2 << endl;
            continue;
        }
        // 一副牌不可能给两个这种情况.
        int type_a = type(play_1);
        int type_b = type(play_2);
        if(type_a == type_b && type_a == 4 && play_1[0] == play_2[0]){
            cout << -2 << endl;
            continue;
        }  // 不合法

        // 所有平手情况
        if(play_1[0] == play_2[0] && play_1[1] == play_2[1] && play_1[2] == play_2[2]){
            cout << 0 << endl;
            continue;
        }
        // 非平手
        if(type_a == type_b){
            if(type_a == 4){
                if(play_1[0] < play_2[0]) cout << -1 << endl;
                else cout << 1 << endl;
            }
            else if(type_a == 3){
                // 特殊情况: QKA, KA2
                if(play_1[2] == play_2[2]) {
                    if(play_1[0] < play_2[0]) cout << 1 << endl;
                    else cout << -1 << endl;
                }
                else if(play_1[2] < play_2[2]) cout << -1 << endl;
                else cout << 1 << endl;
            }
            else if(type_a == 2){
                // 比较 play[1] 即可
                if(play_1[1] < play_2[1]) cout << -1 << endl;
                else if(play_1[1] > play_2[1]) cout << 1 << endl;
                else{
                    if(play_1[2] < play_2[2]) cout << -1 << endl;
                    else cout << 1 << endl;
                }
            }
            else{
                if(play_1[2] < play_2[2] ||
                   (play_1[2]==play_2[2] && play_1[1] < play_2[1]) ||
                   (play_1[2]==play_2[2] && play_1[1]==play_2[1] && play_1[0]<play_2[0])){
                    cout << -1 << endl;
                }
                else cout << 1 << endl;
            }
        }
        else{
            if(type_a < type_b) cout << -1 << endl;
            else cout << 1 << endl;
        }
    }
    return 0;
}

发表于 2016-04-01 17:55:54 回复(2)
截止到2020年9月3日,这道题存在着明显的测试样例问题。题目的格式是空格,但是测试样例是要求换行的。还有,为什么当输入2105  2Q3的时候,为什么实际输出是-1 -1 1 1 1,而不是我们在本地IDE显示的-1。这里让我对牛客有了更加深入的错误认识。
发表于 2020-09-03 23:35:36 回复(0)

C++代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
string getStr(string s){
    int count=0;
    string res="";
    int len=s.size();
    for(int i=0;i<len;i++){
        if((i<len-1)&&s[i]=='1'&&s[i+1]=='0'){
            res+='A';
            i++;
        }else if(s[i]=='A'){
            res+='E';
        }else if(s[i]=='J'){
            res+='B';
        }else if(s[i]=='Q'){
            res+='C';
        }else if(s[i]=='K'){
            res+='D';
        }else if(s[i]>='2'&&s[i]<='9'){
            res+=s[i];
        }else{
            return "";
        }
        count++;
    }
    if(count==3)
        return res;
    else
        return "";
}
vector<int> chartoint(string s){
    vector<int> res(3,0);
    for(int i=0;i<3;i++){
        if(s[i]>='A'&&s[i]<='E'){
            res[i]=10+(s[i]-'A');
        }else
            res[i]=s[i]-'0';
    }
    return res;
}
int getScore(vector<int> v){
    if(v[0]+1==v[1]&&v[1]+1==v[2])
        return v[2]*10000;
    else if(v[0]==v[1]&&v[1]==v[2])
        return v[2]*100000;
    else if(v[0]==v[1])
        return v[1]*1000+v[2];
    else if(v[1]==v[2])
        return v[1]*1000+v[0];
    else 
        return v[2]*100+v[1]*10+v[0];
}
int main(){
    string A,B;
    while(cin>>A>>B){
        string s1=getStr(A);
        string s2=getStr(B);
        if(s1==""||s2==""){
            cout<<-2<<endl;
        }else{
            sort(s1.begin(),s1.end());
            sort(s2.begin(),s2.end());
            vector<int> v1=chartoint(s1);
            vector<int> v2=chartoint(s2);
            int scoreA=getScore(v1);
            int scoreB=getScore(v2);
            if(scoreA==scoreB)
                cout<<0<<endl;
            else if(scoreA>scoreB)
                cout<<1<<endl;
            else if(scoreA<scoreB)
                cout<<-1<<endl;
        }
    }
    return 0;
}
发表于 2018-12-13 17:05:50 回复(0)

我都我自己吓住了,应该很健壮了,包括判断合法性

package com.special.first;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * 搜狐02-扎金花
 *
 * 老思路:对10特殊处理,因为10的第一个字符为1,且唯一,所以我们'1'代替"10"
 *
 * 之后就是排序,然后判断牌的类型,若类型不相同,可以直接判断大小
 * 若类型相同,则可以比较数值大小
 * Create by Special on 2018/3/10 9:55
 */
public class Pro060 {

    static Map<Character, Integer> map = new HashMap<>();

    public static void init(){
        char ch = '2';
        for(int i = 0; i < 8; i++){
            map.put(ch, i);
            ch++;
        }
        map.put('1', 9);map.put('J', 10);
        map.put('Q', 11);map.put('K', 12);
        map.put('A', 13);
    }

    public static void sort(char[] chars){
        int index;
        for(int i = 0; i < 2; i++){
            index = i;
            for(int j = i + 1; j < 3; j++){
                if(map.get(chars[j]) < map.get(chars[index])){
                    index = j;
                }
            }
            if(index != i){
                char temp = chars[i];
                chars[i] = chars[index];
                chars[index] = temp;
            }
        }
    }

    public static char[] convert(String str){
        char[] temp = new char[str.length()];
        int index = 0;
        for(int i = 0; i < str.length(); i++){
            if(str.charAt(i) != '0'){
                temp[index++] = str.charAt(i);
            }
        }
        return Arrays.copyOfRange(temp, 0, index);
    }

    public static int getKind(char[] chars){
        int result = 0;
        if(chars[0] == chars[1] && chars[1] == chars[2]){
            result = 3;
        }else if(map.get(chars[0]) + 1 == map.get(chars[1])
                && map.get(chars[1]) + 1 == map.get(chars[2])){
            result = 2;
        }else if(chars[0] == chars[1] || chars[1] == chars[2]){
            result = 1;
        }
        return result;
    }

    public static int judge(int kind, char[] player1, char[] player2){
        int result = 0;
        if(kind != 1){
            for(int i = 2; i >= 0; i--){
                if(map.get(player1[i]) > map.get(player2[i])){
                    result = 1;
                    break;
                }else if(map.get(player1[i]) < map.get(player2[i])){
                    result = -1;
                    break;
                }
            }
        }else {
            int index1 = map.get(player1[0]) == map.get(player1[1]) ? 0 : 1;
            int index2 = map.get(player2[0]) == map.get(player2[1]) ? 0 : 1;
            if(map.get(player1[index1]) > map.get(player2[index2])){
                result = 1;
            }else if(map.get(player1[index1]) < map.get(player2[index2])) {
                result = -1;
            }
            if(result == 0){
                index1 = (index1 + 2) % 3;
                index2 = (index2 + 2) % 3;
                if(map.get(player1[index1]) > map.get(player2[index2])){
                    result = 1;
                }else if(map.get(player1[index1]) < map.get(player2[index2])){
                    result = -1;
                }
            }
        }
        return result;
    }

    public static boolean isValid(String str){
        boolean result = true;
        int length = 0;
        for(int i = 0; i < str.length(); i++){
            char ch = str.charAt(i);
            if(map.get(ch) == null){
                result = false;
                break;
            }
            if(ch == '1'){
                if(i + 1 >= str.length() || str.charAt(i + 1) != '0'){
                    result = false;
                    break;
                }else {
                    i++;
                }
            }
            length++;
        }
        if(length != 3){
            result = false;
        }
        return result;
    }

    public static void main(String[] args) {
        init();
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
            String str1 = input.next();
            String str2 = input.next();
            int result = 0;
            if(!isValid(str1) || !isValid(str2)){
                result = 2;
            }else {
                char[] player1 = convert(str1);
                char[] player2 = convert(str2);
                sort(player1);
                sort(player2);
                int kind1 = getKind(player1);
                int kind2 = getKind(player2);
                if (kind1 > kind2) {
                    result = 1;
                } else if (kind1 < kind2) {
                    result = -1;
                } else {
                    result = judge(kind1, player1, player2);
                }
            }
            System.out.println(result);
        }
    }
}
发表于 2018-03-10 11:01:56 回复(1)
#include <bits/stdc++.h>

using namespace std;
 
pair<int,int> JudgeType(string &s)
{     int l = s.length();     sort(s.begin(), s.end());     if(s[0]==s[1] && s[1]==s[2])         return make_pair(6, s[0]);     else if(s[1]-s[0]==1 && s[2]-s[1]==1)         return make_pair(5, s[0]);     if(s[0]==s[1])         return make_pair(4, s[0]);     else if(s[0]==s[2])         return make_pair(4, s[0]);     else if(s[1]==s[2])         return make_pair(4, s[1]);     return make_pair(3, *max_element(s.begin(), s.end()));
}

string Exchange(string &raw, string ns, string ne)
{     int l = raw.length();     int p1 = raw.find(ns);     while(p1<l && p1>=0)     {         raw.replace(raw.begin()+p1, raw.begin()+p1+ns.size(), ne);         p1 = raw.find(ns, p1);     }     return raw;
}

void Transform(string &s)
{     s = Exchange(s, "10", "I");     s = Exchange(s, "K", "L");     s = Exchange(s, "Q", "K");     s = Exchange(s, "A", "M");
}

int main()
{     string s1,s2;     while(cin>>s1>>s2)     {         //10 J Q K A         // I J K L M         Transform(s1);         Transform(s2);         pair<int,int> t1 = JudgeType(s1);         pair<int,int> t2 = JudgeType(s2);         if(s1 == s2)             cout<<"0"<<endl;         else{             if(t1.first > t2.first)                 cout<<"1"<<endl;             else if(t1.first < t2.first)                 cout<<"-1"<<endl;             else{                 if(t1.second != t2.second)                     cout<<(t1.second>t2.second?1:-1)<<endl;                 else if(s1[1] != s2[1])                     cout<<(s1[1]>s2[1]?1:-1)<<endl;                 else                     cout<<"0"<<endl;             }         }     }     return 0;
}

发表于 2017-12-24 02:27:35 回复(0)
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
	return a>b;
}
bool transform(const string str,vector<int> &card)
{
	bool good=true;
	/*if(str.size()>5)
		good=false;*/
	for(int i=0;i<str.size();i++)
	{
		switch(str[i])
		{
			case '2':card.push_back(2);break;
			case '3':card.push_back(3);break;
			case '4':card.push_back(4);break;
			case '5':card.push_back(5);break;
			case '6':card.push_back(6);break;
			case '7':card.push_back(7);break;
			case '8':card.push_back(8);break;
			case '9':card.push_back(9);break;
			case '1':card.push_back(10);i++;break;
			case 'J':card.push_back(11);break;
			case 'Q':card.push_back(12);break;
			case 'K':card.push_back(13);break;
			case 'A':card.push_back(14);break;
			default:good=false;break;
		}
	}
	if(card.size()!=3)
		good=false;
	return good;
}
int compare(const vector<int> &card1,const vector<int> &card2,int i)
{
	int res;
	if(i==3)
		return 0;
	if(card1[i]>card2[i])
	{
		res=1;
		return res;
	}
	else if(card1[i]<card2[i])
	{
		res=-1;
		return res;
	}
	else
		return compare(card1,card2,i+1);
}
int cardtype(const vector<int> &card)
{
	int type=0;
	if(card[0]==card[1]&&card[1]==card[2])
		type=3;
	else if(card[0]-card[1]==1&&card[1]-card[2]==1)
		type=2;
	else if(card[0]==card[1]||card[1]==card[2])
		type=1;
	else
		type=0;
	return type;
}
int main()
{
	string str1,str2;
	while(cin>>str1>>str2)
	{
		bool good1,good2;
		vector<int> card1,card2;
		good1=transform(str1,card1);
		good2=transform(str2,card2);
		if(!(good1&&good2))
		{
			cout<<-2<<endl;
			continue;
		}
		sort(card1.begin(),card1.end(),cmp);
		sort(card2.begin(),card2.end(),cmp);
		int type1,type2;
		type1=cardtype(card1);
		type2=cardtype(card2);
		if(type1>type2)
			cout<<1<<endl;
		else if(type1<type2)
			cout<<-1<<endl;
		else
		{
			if(type1!=1)
			{
				int res=compare(card1,card2,0);
				cout<<res<<endl;
			}
			else
			{
				if(card1[0]==card1[1]&&card2[0]==card2[1]||card1[1]==card1[2]&&card2[1]==card2[2])
				{
					int res=compare(card1,card2,0);
					cout<<res<<endl;
				}
				else
				{
					if(card1[0]==card1[1]&&card2[1]==card2[2])
					{
						if(card1[0]>card2[1])
							cout<<1<<endl;
						else
							cout<<-1<<endl;
					}
					else if(card1[1]==card1[2]&&card2[0]==card2[1])
					{
						if(card1[1]>card2[0])
							cout<<1<<endl;
						else
							cout<<-1<<endl;
					}
				}
			}
		}
	}
	return 0;
}

发表于 2017-06-23 10:32:20 回复(0)
#Python版
#刷的最长的一道字符串题,也是醉了
# -*- coding:utf-8 -*-
import sys


def check(person):
    nums = []
    lens = len(person)
    ind = 0
    while ind < lens:
        if person[ind] =='1':
            if person[ind+1] =='0':
                nums.append(10)
                ind +=2
                continue
            else:
                return False,None
        elif person[ind] =='J':
            nums.append(11)
        elif person[ind]=='Q':
            nums.append(12)
        elif person[ind]=='K':
            nums.append(13)
        elif person[ind]=='A':
            nums.append(14)
        else:
            nums.append(int(person[ind]))
        ind +=1
    nums.sort()
    if len(nums) !=3:
        return False,None
    else:
        return True,nums

def checkType(nums):
    setNums = set(nums)
    if len(setNums)==1:
        return 1
    elif len(setNums)==2:
        return 3
    elif nums[0]+1==nums[1] and nums[1]+1==nums[2]:
        return 2
    else:
        return 4

if __name__ == '__main__':
    while True:
        persons = sys.stdin.readline().strip()
        if not persons:
            break
        person1,person2 = persons.split(' ')
        check1,nums1 = check(person1)
        check2,nums2 = check(person2)
        if check1 ==False or check2 ==False:
            print -2
        else:
            type1 = checkType(nums1)
            type2 = checkType(nums2)
            if type1==1:
                if type2==1:
                    if nums1[0] > nums2[0]:
                        print 1
                    elif nums1 < nums2[0]:
                        print -1
                    else:
                        print -2
                else:
                    print 1
            elif type1==2:
                if type2==1:
                    print -1
                elif type2 ==2:
                    if nums1[0] < nums2[0]:
                        print -1
                    elif nums1[0] > nums2[0]:
                        print 1
                    else:
                        print 0
                else:
                    print 1
            elif type1==3:
                if type2==1 or type2 ==2:
                    print -1
                elif type2 ==3:
                    dict1 = {}
                    for i in nums1:
                        dict1[i] = dict1.get(i,0)+1
                    dict2 = {}
                    for i in nums2:
                        dict2[i] = dict2.get(i,0)+1
                    nums11 = None
                    nums12 = None
                    nums21 = None
                    nums22 = None
                    for i in dict1:
                        if dict1[i] ==2:
                            nums11 = i
                        else:
                            nums12 = i
                    for i in dict2:
                        if dict2[i] ==2:
                            nums22 = i
                        else:
                            nums21 = i
                    if nums11 >nums22:
                        print 1
                    elif nums11 <nums22:
                        print -1
                    else:
                        if nums12 > nums21:
                            print 1
                        elif nums12 <nums21:
                            print -1
                        else:
                            print 0
                else:
                    print 1
            else:
                if type2 <=3:
                    print -1
                else:
                    if nums1[-1] >nums2[-1]:
                        print 1
                    elif nums1[-1] <nums2[-1]:
                        print -1
                    elif nums1[-2] >nums2[-2]:
                        print 1
                    elif nums1[-2] <nums2[-2]:
                        print -1
                    elif nums1[0] >nums2[0]:
                        print 1
                    elif nums1[0] <nums2[0]:
                        print -1
                    else:
                        print 0


发表于 2017-03-18 15:39:28 回复(0)
import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			String str1 = in.next();
			
			String str2 = in.next();
		
			int result = compare(str1, str2);
			System.out.println(result);
		}
	}

	public static int compare(String str1, String str2){
		//将输入的两个字符串转换为特定格式
		str1 = changeStr(str1);
		str2 = changeStr(str2);
		//判断牌型
		int numStr1 = judeCard(str1);
		int numStr2 = judeCard(str2);
		if(numStr1 > numStr2){
			return 1;
		}else if(numStr1 < numStr2){
			return -1;
		}else{
			//牌型一样,比较各位
			return compareEach(str1, str2);
		}
	}
	
	//依次比较各位上的大小
	public static int compareEach(String str1, String str2){
		char[] c1 = str1.toCharArray();
		char[] c2 = str2.toCharArray();
		Arrays.sort(c1);
		Arrays.sort(c2);
		//比较第一张牌
		if(c1[2] > c2[2]){
			return 1;
		}else if(c1[2] < c2[2]){
			return -1;
		}else{
			//比较第二张牌
			if(c1[1] > c2[1]){
				return 1;
			}else if(c1[1] < c2[1]){
				return -1;
			}else{
				//比较第三张牌
				if(c1[0] > c2[0]){
					return 1;
				}else if(c1[0] < c1[0]){
					return -1;
				}else{
					return 0;
				}
			}
		}
		
	}
	
	//判断是否为豹子
	public static boolean isBaozi(String s){
		if(s.charAt(0)==s.charAt(1) && s.charAt(1)==s.charAt(2)){
			return true;
		}
		return false;
	}
	
	//判断是否为顺子
	public static boolean isShunzi(String s){
		//转为字符数组
		char[] c = s.toCharArray();
		//排序
		Arrays.sort(c);
		//最大牌面与最小牌面相差2为顺子
		if(c[2] - c[0] == 2){
			return true;
		}
		//8,9,B(8,9,10)
		if(c[0]=='8' && c[2]=='B'){
			return true;
		}
		//9,B,C(9,10,J)
		if(c[0]=='9' && c[2]=='C'){
			return true;
		}
		return false;
	}
	
	//判断是否为对子
	public static boolean isDuizi(String s){
		//如果不是豹子
		if(!isBaozi(s)){
			if(s.charAt(0)==s.charAt(1) || s.charAt(1)==s.charAt(2) || s.charAt(0) == s.charAt(2)){
				return true;
			}
		}
		return false;
	}
	//判断牌型,返回牌型对应的值,方便不同牌型比较大小
	public static int judeCard(String s){
		if(isBaozi(s)){
			return 4;
		}else if(isShunzi(s)){
			return 3;
		}else if(isDuizi(s)){
			return 2;
		}else{
			return 1;
		}
	}
	
	//将字符串转化为特定格式
	public static String changeStr(String s){
		//将10、J、Q、K、A分别用B、C、D、E、F表示,1.将10用单字符表示;2.换成连续字母方便判断顺子
		s = s.replaceAll("10", "B");
		s = s.replaceAll("J", "C");
		s = s.replaceAll("Q", "D");
		s = s.replaceAll("K", "E");
		s = s.replaceAll("A", "F");
		return s;
	}
}


发表于 2016-09-20 09:59:39 回复(1)
/*
 * 对于扑克牌,将不在附近的JQKA和10,交换成IJKLM<=>10,J,Q,K,A,则替换后非常好处理.
 */
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
 
/* return a <type, first_max_element> */
pair<int, int> judgeType(string& s)
{
    intlen = s.size();
    sort(s.begin(), s.end());
    if(s[0] == s[1] && s[1] == s[2])
        returnmake_pair(6, s[0]);  // KKK
    elseif(s[1]-s[0] == 1&& s[2]-s[1] == 1)
        returnmake_pair(5, s[0]);  // JQK
    if(s[0] == s[1])
        returnmake_pair(4, s[0]);  // JJA
    elseif(s[0] == s[2])
        returnmake_pair(4, s[0]);
    elseif(s[1] == s[2])
        returnmake_pair(4, s[1]);
    returnmake_pair(3, *max_element(s.begin(), s.end()));
}
 
string& exchange(string& raw, string ns, string ne)
{
    intlen = raw.size();
    intp1 = raw.find(ns);
    while(p1 < len && p1 >= 0)
    {
        raw.replace(raw.begin()+p1, raw.begin()+p1+ns.size(), ne);
        p1 = raw.find(ns, p1);
    }
    returnraw;
}
 
 
intmain()
{
    string s1;
    string s2;
    while(cin >> s1 >> s2)
    {
        //I-J-K-L-M-N <=> 10, J, Q, K ,A
        s1 = exchange(s1, "10", "I");
        s1 = exchange(s1, "K", "L");
        s1 = exchange(s1, "Q", "K");
        s1 = exchange(s1, "A", "M");
        s2 = exchange(s2, "10", "I");
        s2 = exchange(s2, "K", "L");
        s2 = exchange(s2, "Q", "K");
        s2 = exchange(s2, "A", "M");
        pair<int, int> t1 = judgeType(s1);
        pair<int, int> t2 = judgeType(s2);
        if(s1 == s2)
            cout << "0"<< endl;
        else
        {
            if(t1.first > t2.first)
                cout << "1"<< endl;
            elseif(t1.first < t2.first)
                cout << "-1"<< endl;
            else
            {
                if(t2.second != t1.second)
                    cout << (t1.second > t2.second ? "1": "-1") << endl;
                elseif(s1[1] != s2[1])
                    cout << (s1[1] > s2[1] ? "1": "-1") << endl;
                elseif(s1[0] != s2[0])
                    cout << (s1[0] > s2[0] ? "1": "-1") << endl;
                else
                    cout << "0"<< endl;
            }
        }
    }
    return0;
}

发表于 2016-07-21 14:40:13 回复(0)

大家的答案要么很长要么可解释性很差
我来个短的
关键在于将牌上的234...JQKA转化为可以排大小进而能用字典序比较的abcdefg...
进而牌型相同时比较字典序即可
比如顺子432和1098转化为字母即为cba和ihg显然ihg的字典序大于cba的字典序
同理豹子和单根都可以比较字典序
对子麻烦一点单独处理一下
注:10占两个字符串 先将10转化为字符‘T’后会容易一点

#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;

string map = "23456789TJQKA";
string cha = "abcdefghijklm";
int ha[27];

bool cmp(char a, char b){
    return a > b;
}
int card_mode(string& s){
    int ind;
    while((ind = s.find("10")) != -1){
        s.replace(ind, 2, "T");//将所有的10换成T
    }
    for(int i = 0; i < s.length(); i++){//将牌换成字典序的abcdef...
        int ind = map.find(s[i]);
        if(ind == -1) return -2;
        ha[cha[ind]-'a']++;
        if(ha[cha[ind]-'a'] > 4) return -2;//如果某牌出现超过4次则非法
        string tmp = ""; tmp += cha[ind];
        s.replace(i, 1, tmp);
    }
    if(s.length() != 3) return -2;
    sort(s.begin(), s.end(), cmp);//从大到小排好序
    if(s[0] == s[1] == s[2]) return 4;//4代表豹子
    if(s[0] + 1 == s[1] && s[1] + 1 == s[2]) return 3;//3代表顺子
    if(s[0] == s[1] || s[1] == s[2]) return 2;//2代表对子
    return 1;//1代表普通牌型
}

int solve(string & s1, string & s2){
    int ms1 = card_mode(s1), ms2 = card_mode(s2);
    if(ms1 == -2 || ms2 == -2) return -2;//不合法返回-2
    if(s1 == s2) return 0;//只有牌完全相同返回0
    if(ms1 != ms2) return (ms1 > ms2)?1: -1;//豹子>顺子>对子>单牌
    if(ms1 != 2)  return (s1 > s2)?1: -1;//豹子顺子普通直接比较字典序
    if(ms1 == 2){ //对子要单独考虑一下
        if(s1[1] != s2[1]) return (s1[1] > s2[1])?1: -1;//两个对子不同
        else{
            s1.erase(remove(s1.begin(), s1.end(), s1[1]), s1.end());
            s2.erase(remove(s2.begin(), s2.end(), s2[1]), s2.end());
            return (s1 > s2)? 1: 0;
        }
    }
    return -2;
}

int main(){
    string s1;
    while(cin>>s1){
        string s2; cin>>s2;
        memset(ha, 0, sizeof(ha));
        int ans = solve(s1, s2);
        cout<<ans<<endl;
    }
}
/*
KQ3 3Q9 10QA 6102 5810 7KK 632 74J 10102 K77 JKJ 926 68K 27A
ans:1 1 -1 -1 1 1 -1
*/
编辑于 2018-10-31 16:46:13 回复(0)
/*前面比较函数都太复杂了,如果是豹子就最大的数*100000,顺子就最大的数*10000,
对子就最大的数*1000,剩下的就最大的数*100+第二大的*10+最小的,比较数字大小就好了。*/*
import java.util.*;
import java.lang.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String L = sc.nextLine();
            String[] line = L.split(" ");
            int[] A = chartoInt(line[0]);
            int[] B = chartoInt(line[1]);
            Arrays.sort(A);
            Arrays.sort(B);
            int scoreA = getScore(A);
            int scoreB = getScore(B);
            System.out.println(scoreA > scoreB ? 1 : -1);
        }
    }
    //比较函数,自定义一个数值函数用于比较。
    private static int getScore(int[] A) {
        if (A[0] + 1 == A[1] && A[1] + 1 == A[2])
            return A[2] * 10000;
        else if (A[0] == A[1] && A[1] == A[2])
            return A[2] * 100000;
        else if (A[0] == A[1])
            return A[1] * 1000 + A[2];
        else if (A[1] == A[2])
            return A[1] * 1000 + A[0];
        else return A[2] * 100 + A[1] * 10 + A[0] ;
    }
    //将字符串提取为三个数字,这里的10只要看0或者1就可以了
    private static int[] chartoInt(String str) {
        int res[] = new int[3];
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            switch (str.charAt(i)) {
            case ('J'):res[count++] = 11;break;
            case ('Q'):res[count++] = 12;break;
            case ('K'):res[count++] = 13;break;
            case ('A'):res[count++] = 14;break;
            case ('0'):res[count++] = 10;break;
            case ('1'):break;
            default:
                res[count++] = str.charAt(i)-'0';
                break;
            }
        }
        return res;
    }
}
编辑于 2017-09-01 03:37:34 回复(3)
cdict = {"A":14,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9,"10":10,"J":11,"Q":12,"K":13}

def sot(clist):
    clist = sorted(clist)[::-1]
    if clist[1] == clist[2]:
        clist[0] , clist[2] = clist[2] , clist[0]
    return clist

def baozi(clist):
    if len(set(clist)) == 1:
        return True
    else:
        return False

def shunzi(clist):
    if clist[0] == 3:
        return False
    else:
        if clist[0] - clist[1] == 1 and clist[1] - clist[2] == 1:
            return True

def duizi(clist):
    if clist[0] == clist[1] and clist[0] != clist[2]:
        return True
    else:
        return False

while True:
    try:
        p1 , p2 = input().split()
        list1 ,list2 = [] , []

        for n,i in enumerate(p1):
            if i == "1":
                if p1[n:n+2] == "10":
                    list1.append(cdict["10"])
            if i in cdict.keys():
                list1.append(cdict[i])
       
        for n,i in enumerate(p2):
            if i == "1":
                if p2[n:n+2] == "10":
                    list2.append(cdict["10"])
            if i in cdict.keys():
                list2.append(cdict[i])

        list1 , list2 = sot(list1) , sot(list2)
        level1 , level2 = 1 , 1

        if baozi(list1):
            level1 = 4
        elif shunzi(list1):
            level1 = 3
        elif duizi(list1):
            level1 = 2

        if baozi(list2):
            level2 = 4
        elif shunzi(list2):
            level2 = 3
        elif duizi(list2):
            level2 = 2

        if len(list1) != 3 or len(list2) != 3:
            print(-2)
        else:
            if level1 > level2:
                print(1)
            elif level2 > level1:
                print(-1)
            elif level1 == level2:
                if level1 == 3 or level1 == 4:
                    if list1[0] > list2[0]:
                        print(1)
                    elif list1[0] < list2[0]:
                        print(-1)
                    elif list1[0] == list1[0]:
                        print(0)
                elif level1 == 2:
                    if list1[0] > list2[0]:
                        print(1)
                    elif list1[0] < list2[0]:
                        print(-1)
                    elif list1[0] == list1[0]:
                        if list1[2] > list2[2]:
                            print(1)
                        elif list1[2] < list2[2]:
                            print(-1)
                        elif list1[2] == list2[2]:
                            print(0)
                elif level1 == 1:
                    if list1[0] > list2[0]:
                        print(1)
                    elif list1[0] < list2[0]:
                        print(-1)
                    elif list1[0] == list1[0]:
                        if list1[1] > list2[1]:
                            print(1)
                        elif list1[1] < list2[1]:
                            print(-1)
                        elif list1[1] == list2[1]:
                            if list1[2] > list2[2]:
                                print(1)
                            elif list1[2] < list2[2]:
                                print(-1)
                            elif list1[2] == list2[2]:
                                print(0)
                   
    except:
        break
发表于 2023-04-16 14:23:54 回复(0)
# include<bits/stdc++.h>
using namespace std;
string pos = "234567891JQKA";
void replace(string &s){
    int pos;
    while((pos = s.find("10")) != -1) s.replace(pos, 2, "1");
}
int gettype(vector<int>v){
    if(v[0] == v[1] && v[1] == v[2]) return 4;
    if(v[0] + 1 == v[1] && v[1] + 1 == v[2]) return 3;
    if(v[0] == v[1] || v[1] == v[2]) return 2;
    return 1;
}
string getcode(string s){
    vector<int>v;
    for(int i = 0; i < 3; i++) v.push_back(pos.find(s[i]));
    sort(v.begin(),v.end());
    int type = gettype(v);
    string code = to_string(type);
    if(type == 2 and v[0] == v[1]) reverse(v.begin(), v.end());
    for(int i = 2; i >= 0; i--) code += (v[i] + 'a');
    return code;
}
int main(){
    string s1, s2;
    while(cin >> s1 >> s2){
        replace(s1);
        replace(s2); 
        int ans = getcode(s1) > getcode(s2) ? 1 : -1;
        cout << ans << endl;
    }
    return 0;
}

发表于 2022-08-17 20:42:11 回复(0)
哭了,写的我好辛苦啊,太菜了
#include<bits/stdc++.h>
using namespace std;
#define maxn 100
// #define test

bool cmp(int a,int b)
{
    return a>b;
}
int Judge_mode2(int card[])
{
    unordered_map<int,int> dict;
    for(int i=0;i<3;i++)
    {
        if(dict.count(card[i])){
            dict[card[i]]++;
            if(dict[card[i]]==2)
            {
                return card[i];
            }
        }
        else{
            dict[card[i]]=1;
        }
    }
    return 0;
}

bool Judge_mode1(int card[])
{
    unordered_map<int,int> dict;
    for(int i=0;i<3;i++)
    {
        if(dict.count(card[i])){
            dict[card[i]]++;
            if(dict[card[i]]==3)
            {
                return true;
            }
        }
        else{
            dict[card[i]]=1;
        }
    }
    return false;
}
bool Judge_mode3(int card[])
{
    int flag=0;
    for(int i=1;i<3;i++)
    {
        if(card[i]==card[i-1]-1)    continue;
        else{
            flag=1;
        }
    }
    if(flag==1)    return false;
    return true;
}
int Judge_num(int card1[],int card2[])
{
    for(int i=0;i<3;i++)
        {
            if(card1[i]>card2[i]){
                 return 1;
            }
            else if(card1[i]==card2[i])    continue;
            else{
                return -1;
            }
        }
        return 0;
}
int main()
{
    unordered_map<char,int> dict={
        {'J',11},
        {'Q',12},
        {'K',13},
        {'A',14}
    };
    string s1,s2;
    while(cin>>s1>>s2)
    {
        int card1[3];
        int size=0;
        for(int i=0;i<s1.size();i++)
        {
            if(s1[i]=='1'){
                if(i+1<s1.size()&&s1[i+1]=='0')   
                {
                    card1[size++]=10;           
                    i++;
                }
                else{
                    card1[size++]=1;
                }
            }
            else{
                if(!isdigit(s1[i]))
                {
                    card1[size++]=dict[s1[i]];
                }
                else{
                    card1[size++]=s1[i]-'0';
                }
            }
        }
        size=0;
        int card2[3];
        for(int i=0;i<s2.size();i++)
        {   
            if(s2[i]=='1'){
                if(i+1<s2.size()&&s2[i+1]=='0')   
                {
                    card2[size++]=10;           
                    i++;
                }
                else{
                    card2[size++]=1;
                }
            }
            else{
                if(!isdigit(s2[i]))
                {
                    card2[size++]=dict[s2[i]];
                }
                else{
                    card2[size++]=s2[i]-'0';
                }
            }
        }
            #ifdef test
            for(int i=0;i<3;i++)
            {
                cout<<card1[i]<<" ";
            }
            cout<<endl;
            for(int i=0;i<3;i++)
            {
                cout<<card2[i]<<" ";
            }
        cout<<endl;
            #endif
        sort(card1,card1+3,cmp);
        sort(card2,card2+3,cmp);
        if(Judge_mode3(card1)){
            if(Judge_mode3(card2)){
                cout<<Judge_num(card1,card2)<<endl;
            }
            else{
                cout<<1<<endl;
            }
        }
        else if(int c1=Judge_mode2(card1)){
            if(Judge_mode3(card2)){
                cout<<-1<<endl;
            }
            else if(int c2=Judge_mode2(card2)){
                if(c1>c2)    cout<<1<<endl;
                else    cout<<-1<<endl;
            }
            else{
                cout<<1<<endl;
            }
        }
        else if(Judge_mode1(card1)){
            if(Judge_mode2(card2)||Judge_mode3(card2)){
                cout<<-1<<endl;
            }
            else if(Judge_mode1(card2)){
                cout<<Judge_num(card1,card2)<<endl;
            }
            else{
                cout<<1<<endl;
            }
        }
        else{
            if(Judge_mode1(card2)||Judge_mode2(card2)||Judge_mode3(card2))
            {
                cout<<-1<<endl;
            }
            else    cout<<Judge_num(card1,card2)<<endl;
        }
        
    }
}


发表于 2022-06-23 15:06:25 回复(0)
#解题思路:将三张扑克牌转化成数字数组,按降序排列,并在最后增加牌型的数字,
#按大到小分为豹子4,顺子3,对子2,普通1,最后将每一副牌转化成了一个四元素的数组
#之后对两个玩家的牌从后向前做比较,输出结果

#定义生成四元素数组的函数,增加牌型
def judgeType(st):
    #定义字典,将牌转换成数字
    dic = {'A':14,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'R':10,'J':11,'Q':12,'K':13}
    #将玩家牌中的10替换成R,方便处理
    PaiType = st.replace('10','R')
    PaiTypeList = []
    if len(PaiType) != 3:
        return 0
    #将玩家的牌转换成数字
    for i in range(3):
        PaiTypeList.append(dic[PaiType[i]])
    #将玩家的牌按降序排列
    PaiTypeListR = sorted(PaiTypeList,reverse=False)
    #判断是否是豹子,判断方法:确认一个元素在数组中是否有三个
    if PaiTypeList.count(PaiTypeList[0]) == 3:
        flag = 4
    #判断是否是对子,判断方法:由于已排序,所以只需要将中间元素和两边的进行比较
    elif PaiTypeListR[1] == PaiTypeListR[0]&nbs***bsp;PaiTypeListR[1] == PaiTypeListR[2]:
        #判断形成对子的牌是否比单牌要小,如果是,则将对子的牌放在数组的后边位置,便于后续比较
        if PaiTypeListR[1] == PaiTypeListR[0] and PaiTypeListR[2] > PaiTypeListR[1]:
            PaiTypeListR = sorted(PaiTypeList,reverse=True)
        flag = 2
    #判断是否是顺子
    elif sum(PaiTypeListR) == PaiTypeListR[1]*3 and PaiTypeListR[1] + 1 == PaiTypeListR[2]:
        flag = 3
    #剩余的则为普通牌型
    else:
        flag = 1
    #将牌型数据增加到数组的尾端
    PaiTypeListR.append(flag)
    #返回四元素数组
    return PaiTypeListR
while True:
    try:
        li = list(map(str, input().split(' ')))
        re = []
        for i in range(1,len(li)):
            PaiTypeListR1 = judgeType(li[i-1])
            PaiTypeListR2 = judgeType(li[i])
            #对数组从后向前进行判断,比较两副牌的大小
            for i in range(4):
                if PaiTypeListR1[3-i] > PaiTypeListR2[3-i]:
                    res = 1
                    break
                elif PaiTypeListR1[3-i] < PaiTypeListR2[3-i]:
                    res = -1
                    break
                else:
                    res = 0
            re.append(res)
        #print(PaiTypeListR1,PaiTypeListR2)
        for i in re:
            print(i)
    except:
        break


发表于 2021-10-20 11:48:39 回复(0)
不要这么长吧
import java.util.*;
public class Main{
    private static final String NODE="00234567891JQKA";
    public static void main(String[] args){
         Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
             String[] strs=sc.nextLine().split(" ");
             for(int i=0;i<strs.length;i+=2) {
                System.out.print(getNode(strs[i]).compare(getNode(strs[i+1]))+" ");
             }
            System.out.println();
         }
         sc.close();
    }
    public static Node getNode(String str) {
		int[] value=new int[3];
		int n=0;
		for(int i=0;i<str.length();i++) {
			char c=str.charAt(i);
			if(c=='0')
				continue;
			int index=NODE.indexOf(c);
			value[n++]=index;
		}
		return new Node(value);
	}
}
class Node{
	private int[] mValue;
	private int mType;
	public Node(int[] value) {
		mValue=Arrays.copyOf(value, 3);
		Arrays.sort(mValue);
		setType();
	}
	private void setType() {
		if(mValue[0]==mValue[2])
			mType=4;
		else if(mValue[0]==mValue[1]-1&&mValue[1]==mValue[2]-1)
			mType=3;
		else if(mValue[0]==mValue[1]||mValue[1]==mValue[2]){
			mType=2;
            if(mValue[0]==mValue[1]) {
				int tmp=mValue[2];
				mValue[2]=mValue[0];
				mValue[0]=tmp;
			}
        }
		else
			mType=1;
	}
	
	public int compare(Node o) {
		int n=0;
		if(mType==o.mType) {
			for(int i=2;i>=0;i--) {
				if(mValue[i]!=o.mValue[i]) {
					n=mValue[i]-o.mValue[i];
					break;
				}
			}
		}else {
			n=mType-o.mType;
		}
		if(n>0)
			return 1;
		else if(n<0)
			return -1;
		else
			return 0;
	}
}


发表于 2021-02-05 17:45:48 回复(0)
while True:
    try:
        inp1,inp2=list(input().split(' '))
        #print(inp1,inp2)
        def data(inp):#用于识别数字10
            num=0
            re1=[]
            for i in inp:
                if i!='1'and i!='0':
                    re1.append(i)
                elif i=='1':
                    num+=1
            result=[]
            if num!=0:
                for i in range(num):
                    result.append('10')
            if len(re1)!=0:
                for i in re1:
                    result.append(i)
            return result

        inp1=data(inp1)
        inp2=data(inp2)   
        list1=['2','3','4','5','6','7','8','9','10','J','Q','K','A']
        def isbaozi(inp):
            re=False
            for i in inp:
                if inp.count(i)==3:
                    re=True
                    break
            return re
        def isduizi(inp):
            re=False
            for i in inp:
                if inp.count(i)==2:
                    re=True
                    break
            return re
        def isshunzi(inp):
            re=[]
            for i in inp:
                re.append(list1.index(i))
            re=sorted(re)
            if re[0]+1==re[1] and re[1]+1==re[2]:
                return True
            else:
                return False
        if isbaozi(inp1):
            if isbaozi(inp2):
                if list1.index(inp1[0])>list1.index(inp2[0]):
                    print(1)
                elif list1.index(inp1[0])<list1.index(inp2[0]):
                    print(-1)
                else:
                    print(0)
            else:
                print(1)
        elif isshunzi(inp1):
            if isshunzi(inp2):
                if list1.index(inp1[0])>list1.index(inp2[0]):
                    print(1)
                elif list1.index(inp1[0])<list1.index(inp2[0]):
                    print(-1)
                else:
                    print(0)
            elif isbaozi(inp2):
                print(-1)
            else:
                print(1)
        elif isduizi(inp1):
            if isduizi(inp2):
                for i in inp1:
                    if inp1.count(i)==2:
                        break
                for j in inp2:
                    if inp2.count(j)==2:
                        break
                if list1.index(i)>list1.index(j):
                    print(1)
                elif list1.index(i)<list1.index(j):
                    print(-1)
                else:
                    print(0)
            elif isbaozi(inp2) or isshunzi(inp2):
                print(-1)
            else:
                print(1)
        else:
            if isbaozi(inp2) or isshunzi(inp2) or isduizi(inp2):
                print(-1)
            else:
                re1=[]
                re2=[]
                for i in inp1:
                    re1.append(list1.index(i))
                for j in inp2:
                    re2.append(list1.index(j))
                re1=sorted(re1,reverse=True)
                re2=sorted(re2,reverse=True)
                if re1[0]>re2[0]:
                    print(1)
                elif re1[0]<re2[0]:
                    print(-1)
                else:
                    if re1[1]>re2[1]:
                        print(1)
                    elif re1[1]<re2[1]:
                        print(-1)
                    else:
                        if re1[2]>re2[2]:
                            print(1)
                        elif re1[2]<re2[2]:
                            print(-1)
                        else:
                            print(0)
    except:
        break

主要是数字10要注意识别出来,其余的还好
编辑于 2019-07-23 15:46:01 回复(0)

#include <iostream>

#include <string>

#include <algorithm>

using namespace std;

void tanser1(string &s){

    int index = s.find("10");//需要注意的是判断10是否有多个。

    if (index!=-1)

       s.replace(index, 2, "I");

     index = s.find("10");

    if (index!=-1)

       s.replace(index, 2, "I");

     index = s.find("10");

    if (index!=-1)

       s.replace(index, 2, "I");

    for (int i = 0; i<4; i++) {

       switch(s[i]) {

            case '2': s[i] = 'A'; break;

           case '3': s[i] = 'B'; break;

           case '4': s[i] = 'C'; break;

           case '5': s[i] = 'D'; break;

           case '6': s[i] = 'E'; break;

           case '7': s[i] = 'F'; break;

           case '8': s[i] = 'G'; break;

           case '9': s[i] = 'H'; break;

           case 'J': s[i] = 'J'; break;

           case 'Q': s[i] = 'K'; break;

           case 'K': s[i] = 'L'; break;

           case 'A': s[i] = 'M'; break;

       }

    }

}

 

bool comp(char a, char b){

    return a>b;

}

int model(string &s){

    sort(s.begin(), s.end(), comp);

    if (s[0] == s[1] == s[2]) return 4;

    else if (s[0] + 1 == s[1] && s[1] + 1 == s[2]) return 3;

    else if (s[0] == s[1] || s[1] == s[2]) return 2;

    else return 1;

}

int main(){

    int i, j, res = 1;

    string s1, s2;

    while (cin>>s1>>s2)  {

       tanser1(s1);

       tanser1(s2);

       if (s1.length() != 3 || s1.length() != 3){

           cout << -1 << endl; continue;

       }

       int flag1, flag2;

       int res;

       flag1 = model(s1);

       flag2 = model(s2);

       if (flag1 == flag2) {

           if (s1>s2) res = 1;

           else if (s1 == s2) res = 0;

           else res = -1;

       }

       else if (flag1>flag2) res = 1;

       else if (flag1<flag2) res = -1;

       cout << res << endl;

    }

}


发表于 2019-03-06 16:32:31 回复(0)

问题信息

难度:
69条回答 14539浏览

热门推荐

通过挑战的用户

查看代码
扎金花