代码自取 排版自排
一二题采用递归将字符串分成最小先后序串和最小中序串,确定其父节点,建立二叉树。
3.4.5题就不用说了吧。
第六题奈何有点菜,目前只能想出暴力解法,最多加几个条件优化一下。
24点public class TwnTree { ElementType data; TwnTree lchild; TwnTree rchild; public TwnTree() { data=new ElementType(); lchild=rchild=null; }}
public class ElementType {double data;char ch;}
public class Twentyfour
{ public static int cy=0; public static ArrayList<String> str=new ArrayList(); public static ArrayList<String> newstr=new ArrayList(); public static int count=0;// public static int count1=0;// public static int count2=0;//array is too big public static ArrayList<String> st1=new ArrayList();//char public static ArrayList<String> st2=new ArrayList();//math public static void BTdata() { String[] a= {"1","2","3","4","5","6","7","8","9"}; for(int i=0;i<a.length;i++) { for(int j=0;j<a.length;j++) { for(int k=0;k<a.length;k++) { for(int l=0;l<a.length;l++) { String s=a[i]+a[j]+a[k]+a[l]; st2.add(s); } } } } }public static ArrayList<String> createstring(){ //four calculate word BTstring(); BTdata(); for(String s:st1) { for(String s1:st2) { str.add(s+s1); } } return str;}private static void BTstring() { // TODO Auto-generated method stub String[] a1={"+","-","*"}; String[] a2={"+","-","/"}; String[] a3={"+","*","/"}; String[] a4={"-","*","/"}; for(int i=0;i<a1.length;i++) { for(int j=0;j<a1.length;j++) { for(int k=0;k<a1.length;k++) { st1.add(a1[i]+a1[j]+a1[k]); } } } for(int i=0;i<a2.length;i++) { for(int j=0;j<a2.length;j++) { for(int k=0;k<a2.length;k++) { st1.add(a2[i]+a2[j]+a2[k]); } } } for(int i=0;i<a3.length;i++) { for(int j=0;j<a3.length;j++) { for(int k=0;k<a3.length;k++) { st1.add(a3[i]+a3[j]+a3[k]); } } } for(int i=0;i<a4.length;i++) { for(int j=0;j<a4.length;j++) { for(int k=0;k<a4.length;k++) { st1.add(a4[i]+a4[j]+a4[k]); } } }}public static TwnTree CreateTree(TwnTree root,char[] s){ if(count==s.length) return root; if(s[count]=='#') { count++; root=null; return root; } else { root=new TwnTree(); if(s[count]=='+'||s[count]=='-'||s[count]=='*'||s[count]=='/') root.data.ch=s[count]; else { root.data.data=(double)s[count]-'0'; } count++; root.lchild=CreateTree(root.lchild,s); root.rchild=CreateTree(root.rchild,s); } return root;}public static double Calculate(TwnTree root){ double val=0.0; if(root.lchild==null && root.rchild==null) { val=root.data.data; } else { double sum1=Calculate(root.lchild); double sum2=Calculate(root.rchild); switch(root.data.ch) { case '+':val=sum1+sum2; break; case '-':val=sum1-sum2; break; case '*':val=sum1*sum2; break; case '/':val=sum1/sum2; break; } } return val;}public static double Travel(TwnTree T){ double value=0.0; if(T.lchild==null&& T.rchild==null) { double n=T.data.data; System.out.print((int)n); value=T.data.data; } else { System.out.print("("); double num1=Travel(T.lchild); System.out.print(T.data.ch); double num2=Travel(T.rchild); System.out.print(")"); switch(T.data.ch) { case '+':value=num1+num2; case '-':value=num1-num2; case '*':value=num1*num2; case '/':value=num1/num2; } } return value;}public static void solve(){ str=createstring(); Iterator<String> it=str.iterator(); while(it.hasNext()) { String str=it.next(); //tree01 String str1=""; str+=(String)str.subSequence(0, 3); for(int i=3;i<str.length();i++) { str1+=(String)str.subSequence(i, i+1)+"##"; } newstr.add(str1); //tree02 String t1=(String) str.subSequence(0,2); t1+=str.charAt(3)+"##";//++x## String t2=str.charAt(4)+"##";//x## String t3=(String)str.subSequence(2, 3); t3+=str.charAt(5)+"##"+str.charAt(6)+"##";//+x##x## String str2=t1+t2+t3; newstr.add(str2); }}public static void main(String[] args){ TwnTree T;// Scanner sc=new Scanner(System.in); solve(); Iterator<String> it=newstr.iterator(); while(it.hasNext()) { String str=it.next();// String str=sc.next(); char[] ch=str.toCharArray(); double d=0.0; if(ch[0]=='#') T=null; else { T=new TwnTree(); if(ch[count]=='+'||ch[count]=='-'||ch[count]=='*'||ch[count]=='/') T.data.ch=ch[count]; else { double sum=0.0; for(int index=0;index<ch.length;index++) { sum=sum*10+1.0*(ch[index]-'0'); } T.data.data=sum; } count++; T.lchild=CreateTree(T.lchild,ch); T.rchild=CreateTree(T.rchild,ch); d=Calculate(T); } if(24-d>=0&&24-d<=0.000001) { double data=Travel(T); System.out.println("=24"); } else { //System.out.println("No"); } count=0; } }}