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);
}
}
}