蒟蒻解法-┭┮﹏┭┮,别乱学,第一次发,还在摸索咋样排版,写解释 |
import java.io.IOException;
import java.util.Scanner;
public class Main
{
static Scanner in=new Scanner(System.in);
static double an[]=new double[4];
static double bn[]=new double[4];
static int cn[]=new int[4];
public static void main(String[] args)throws IOException
{
// bn[0]=8;bn[1]=3;bn[2]=8;bn[3]=3;
// System.out.println(yunsuan(4, 2, 4)?"Yes":"No");
// System.out.println(8*1.0/(3-8*1.0/3));
// System.out.println(8*1.0/(3-8*1.0/3)==24);//爆java精度了
while (in.hasNext())
{
cn=new int[4];
for(int i=0;i<4;i++)an[i]=in.nextInt();
System.out.println(dfs(4,0)?"Yes":"No");
}
System.gc();
}
// 24/3---9/3 9/3 64/8 64/8
static boolean dfs(int len,int index)//打乱,排列组合出4*3*2=24种排列方式
{
if(index==len)
{
// for(int i=0;i<4;i++)System.out.print(cn[i]+" ");
// System.out.println();
return order();
}
for(int i=0;i<4;i++)
{
boolean flag=true;
for(int j=0;j<index;j++)
{
if(cn[j]==i) {flag=false;break;}
}
if(flag)
{
bn[index]=an[i];
cn[index]=i;
if(dfs(len,index+1))return true;
}
}
return false;
}
static boolean order() //4个数中插入3个符号
{
int s[]= {1,2,3,4};//+,-,*,/
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
for(int k=0;k<4;k++)
{
if(yunsuan(s[i],s[j],s[k]))return true;
}
}
}
return false;
}
static char[] ss= {'+','-','*','/'};
static boolean yunsuan(int i,int j,int k) //加括号
{
double ans=jisuan(bn[0], jisuan(bn[1],jisuan(bn[2], bn[3],k), j), i);
if(Math.abs(ans-24)<=(double)(1e-6)) //a(b,(c,d))
{
System.out.printf("%.0f%c(%.0f%c(%.0f%c%.0f))",bn[0],ss[i-1],bn[1],ss[j-1],bn[2],ss[k-1],bn[3]);
return true;
}
ans=jisuan(bn[0],jisuan(jisuan(bn[1],bn[2],j), bn[3],k),i);
if(Math.abs(ans-24)<=(double)(1e-6))//a((b,c)d)
{
System.out.printf("%.0f%c((%.0f%c%.0f)%c%.0f)",bn[0],ss[i-1],bn[1],ss[j-1],bn[2],ss[k-1],bn[3]);
return true;
}
ans=jisuan(jisuan(bn[0], bn[1], i), jisuan(bn[2],bn[3],k), j);
if(Math.abs(ans-24)<=(double)(1e-6))//(a,b)(c,d)
{
System.out.printf("(%.0f%c%.0f)%c(%.0f%c%.0f)",bn[0],ss[i-1],bn[1],ss[j-1],bn[2],ss[k-1],bn[3]);
return true;
}
ans=jisuan(jisuan(jisuan(bn[0], bn[1], i),bn[2],j),bn[3],k);
if(Math.abs(ans-24)<=(double)(1e-6))//((a,b)c)d
{
System.out.printf("((%.0f%c%.0f)%c%.0f)%c%.0f",bn[0],ss[i-1],bn[1],ss[j-1],bn[2],ss[k-1],bn[3]);
return true;
}
ans=jisuan(jisuan(bn[0], jisuan(bn[1], bn[2],j), i),bn[3],k);
if(Math.abs(ans-24)<=(double)(1e-6))//(a(b,c))d
{
System.out.printf("(%.0f%c(%.0f%c%.0f))%c%.0f",bn[0],ss[i-1],bn[1],ss[j-1],bn[2],ss[k-1],bn[3]);
return true;
}
return false;
}
static double jisuan(double x,double d,int flag)
{
switch (flag)
{
case 1:return x+d;
case 2:return x-d;
case 3:return x*d;
case 4:if(d!=0)return x/d;else return 1000007;
}
return 1000007;
}
}