题解 | #24点运算#
24点运算
http://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
主要考回溯法求全排列
``` import java.util.*;
public class TwenlyFourygame {
public static List<String> opList=Arrays.asList("+","-","*","/");
public static List<String> reList=new ArrayList<>();
public static HashMap<String, Integer> map = new HashMap<String, Integer>(){
{
put("A", 1);
put("2", 2);
put("3", 3);
put("4", 4);
put("5", 5);
put("6", 6);
put("7", 7);
put("8", 8);
put("9", 9);
put("10", 10);
put("J", 11);
put("Q", 12);
put("K", 13);
}
};
public static HashMap<Integer,String> mapReverse = new HashMap<Integer,String>(){
{
put( 1,"A");
put( 2,"2");
put( 3,"3");
put( 4,"4");
put( 5,"5");
put( 6,"6");
put( 7,"7");
put( 8,"8");
put( 9,"9");
put( 10,"10");
put( 11,"J");
put( 12,"Q");
put( 13,"K");
}
};
public static int maxn=100;
public static boolean flag=false;
public static String[] opReList=new String[maxn];
public static int[] a=new int[maxn];
public static int[] b=new int[maxn];
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
String s = in.nextLine();
String[] arr = s.split(" ");
boolean f=true;
for(int i=0;i<arr.length;i++){
if("joker".equals(arr[i].toLowerCase())){
f=false;
break;
}else{
b[i]=map.get(arr[i]);
}
}
if(!f){
System.out.println("ERROR");
}else{
permutation(0,b);
if(reList.size()!=0){
System.out.println(reList.get(0));
}else{
System.out.println("NONE");
}
}
reList.clear();
}
}
public static void permutation(int cur ,int[] p){
if(cur==4){
dfs(0,0);
}else for(int i=0;i<4;i++){
int c1=0,c2=0;
for(int j=0;j<cur;j++)if(a[j]==p[i])c1++;
for(int j=0;j<4;j++)if(p[j]==p[i])c2++;
if(c1<c2){
a[cur]=p[i];
permutation(cur+1,p);
}
}
}
public static void dfs(int cur ,int sum){
if(cur==4){
if(sum==24){
if("+".equals(opReList[0])){
StringBuilder sb=new StringBuilder();
for(int i=0;i<3;i++){
sb.append(mapReverse.get(a[i]));
sb.append(opReList[i+1]);
}
sb.append(mapReverse.get(a[3]));
reList.add(sb.toString());
}
return;
}
}else for(int i=0;i<4;i++){
String op=opList.get(i);
switch(op){
case "+" :
opReList[cur]="+";
dfs(cur+1,sum+a[cur]);
break;
case "-" :
opReList[cur]="-";
dfs(cur+1,sum-a[cur]);
break;
case "*" :
opReList[cur]="*";
dfs(cur+1,sum*a[cur]);
break;
case "/" :
opReList[cur]="/";
dfs(cur+1,sum/a[cur]);
break;
}
}
}
}