首页 > 试题广场 >

扎金花

[编程题]扎金花
  • 热度指数:3528 时间限制: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
/*前面比较函数都太复杂了,如果是豹子就最大的数*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)
package NewCoder.XiaoZhaoZhenTi;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class test3_20 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNextLine()) {
			String X = scanner.nextLine();
			String[] xStrings = X.split("\\s+");
			String string1 = xStrings[0];
			String string2 = xStrings[1];
			try {
				System.out.println(isBig(string1, string2));
			} catch (Exception ex) {
				System.out.println(-2);
			}
		}
	}
	static int isBig(String string1, String string2) {
		ArrayList<Integer> list1 = new ArrayList<>();// 第一个的数字list
		ArrayList<Integer> list2 = new ArrayList<>();// 第二个的数字list
		list1 = getList(string1);//取出字符串1中的数字到list1中
		list2 = getList(string2);//取出字符串2中的数字到list2中
		Collections.sort(list1);
		Collections.sort(list2);
		int level1 = getLevel(list1);//牌的等级
		int level2 = getLevel(list2);
		if (level1 < level2) {
			return -1;
		} else if (level1 > level2) {
			return 1;
		} else {//不是一个等级,判断大小
			if (level1 == 2) {
				// 如果是对子,比对数
				int x1 = 0;
				int x2 = 0;
				if (list1.get(0) == list1.get(1)) {
					x1 = list1.get(0);
				} else {
					x1 = list1.get(1);
				}
				if (list2.get(0) == list2.get(1)) {
					x2 = list2.get(0);
				} else {
					x2 = list2.get(1);
				}
				if (x1 > x2) {
					return 1;
				} else if (x1 < x2) {
					return -1;
				} else {
					return 0;
				}
			}
			// 如果不是对子,比顺序大小
			int x1 = list1.get(2) * 100 + list1.get(1) * 10 + list1.get(0);
			int x2 = list2.get(2) * 100 + list2.get(1) * 10 + list2.get(0);
			if (x1 < x2) {
				return -1;
			} else if (x1 > x2) {
				return 1;
			} else {
				return 0;
			}
		}
	}
	//取出字符串中的数字到list中
	static ArrayList<Integer> getList(String string1) { 
		ArrayList<Integer> list1 = new ArrayList<>();
		if (string1.length() == 5) {// 取出数字 J = 11 Q = 12
			string1 = string1.replaceAll("10", "");
			list1.add(10);
			list1.add(10);
			char x = string1.charAt(0);
			list1.add(getDigitFromChar(x));
		} else if (string1.length() == 4) {
			string1 = string1.replaceAll("10", "");
			list1.add(10);
			list1.add(getDigitFromChar(string1.charAt(0)));
			list1.add(getDigitFromChar(string1.charAt(1)));
		} else {
			list1.add(getDigitFromChar(string1.charAt(0)));
			list1.add(getDigitFromChar(string1.charAt(1)));
			list1.add(getDigitFromChar(string1.charAt(2)));
		}
		return list1;
	}

	public static int getDigitFromChar(char x) {
		if (Character.isDigit(x)) {
			return x - '0';
		} else {
			if (x == 'A') {
				return 14;
			} else if (x == 'K') {
				return 13;
			} else if (x == 'Q') {
				return 12;
			} else {
				return 11;
			}
		}
	}
	public static int getLevel(ArrayList<Integer> list) {// 要求排序
		// 得出牌的等级 1散牌 2对子 3顺子 4豹子
		if (list.get(0) == list.get(1)) {
			if (list.get(1) == list.get(2)) {
				return 4;
			} else {
				return 2;// 非豹即对
			}
		}
		if (list.get(1) == list.get(2)) {
			return 2;// 对子
		}
		if (list.get(2) - list.get(1) == 1) {
			if (list.get(1) - list.get(0) == 1) {
				return 3;// 顺子
			}
		}
		return 1;
	}
}

发表于 2017-05-18 20:56:26 回复(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)

问题信息

难度:
4条回答 14253浏览

热门推荐

通过挑战的用户

查看代码
扎金花