ZOJ-2409

MS是目前写过的代码最多的一道题,题目读半天,英语捉鸡只能不停查有道,大意就是一共5张牌,给观众一张,魔术师手里有4张,然后猜观众的牌,剩下的4张中,后面3张的最小牌值的位置先确定,1,2,3  3种情况,然后第一张牌的牌值加上这个位置数字,剩下的两张牌牌序如果是反的,那么这个值再加3,算出的值对13取余,然后取第一张牌的花色,合起来就是观众的手里的牌。理解了之后就是苦力码代码了,WA了一次,最后那个数字算出来之后还要转下字母的,比如说12要转成Q,我原先直接就用12来拼了。。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.nextLine();
		for (int i = 1; i <= n; i++)
		{
			String line = sc.nextLine();
			String[] array = line.split(" ");
			Arrays.sort(array, new CardCmp());
			List<String[]> all = allString(array);
			for (String[] a : all)
				if (isRight(a))
				{
					System.out.format("Problem %d:", i);
					for (String s : a)
						System.out.print(" " + s);
					System.out.println();
					break;
				}
		}
	}

	static boolean isRight(String[] array)
	{
		if (getSuit(array[0]) != getSuit(array[1]))
			return false;
		int p = positionOfThree(array[2], array[3], array[4]);
		int number = getNumber(array[1]);
		number += p;
		int a, b;
		if (p == 1)
		{
			a = 3;
			b = 4;
		}
		else if (p == 2)
		{
			a = 2;
			b = 4;
		}
		else
		{
			a = 2;
			b = 3;
		}
		if (new CardCmp().compare(array[a], array[b]) > 0)
			number += 3;
		number %= 13;
		String result = getFirstChar(number) + "" + getSuit(array[1]);
		return array[0].equals(result);
	}

	static String getFirstChar(int number)
	{
		if (number == 1)
			return "A";
		else if (number == 11)
			return "J";
		else if (number == 12)
			return "Q";
		else if (number == 13)
			return "K";
		else
			return number + "";
	}

	static char getSuit(String s)
	{
		return s.charAt(s.length() - 1);
	}

	static int getNumber(String s)
	{
		return CardCmp.map.get(s.charAt(0));
	}

	static List<String[]> allString(String[] array)
	{
		List<String[]> all = new ArrayList<String[]>();
		for (int i = 0; i < 5; i++)
			for (int j = 0; j < 5; j++)
				if (j != i)
					for (int k = 0; k < 5; k++)
						if (k != j && k != i)
							for (int l = 0; l < 5; l++)
								if (l != k && l != j && l != i)
									for (int m = 0; m < 5; m++)
										if (m != l && m != k && m != j
												&& m != i)
											all.add(new String[] { array[i],
													array[j], array[k],
													array[l], array[m] });
		return all;
	}

	static int positionOfThree(String s1, String s2, String s3)
	{
		CardCmp cc = new CardCmp();
		String min = s1;
		int index = 1;
		if (cc.compare(min, s2) > 0)
		{
			min = s2;
			index = 2;
		}
		if (cc.compare(min, s3) > 0)
			index = 3;
		return index;
	}

	static class CardCmp implements Comparator<String>
	{
		static Map<Character, Integer> map = new HashMap<Character, Integer>();
		static
		{
			map.put('A', 1);
			map.put('2', 2);
			map.put('3', 3);
			map.put('4', 4);
			map.put('5', 5);
			map.put('6', 6);
			map.put('7', 7);
			map.put('8', 8);
			map.put('9', 9);
			map.put('1', 10);
			map.put('J', 11);
			map.put('Q', 12);
			map.put('K', 13);
		};

		@Override
		public int compare(String o1, String o2)
		{
			int i1 = map.get(o1.charAt(0));
			int i2 = map.get(o2.charAt(0));
			if (i1 != i2)
				return i1 - i2;
			else
				return o1.charAt(o1.length() - 1) - o2.charAt(o2.length() - 1);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值