问题描述:给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利
输入:
4个1-10的数字。[数字允许重复,测试用例保证无异常数字]
输出:
true or false
样例输入:7 2 1 10
样例输出:true
分析:+,-,*,/,()----控制运算顺序
穷举法 +动态规划+部分穷举(取出等价和无解部分)
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int m1=sc.nextInt();
int m2=sc.nextInt();
int m3=sc.nextInt();
int m4=sc.nextInt();
System.out.print(result(m1, m2, m3,m4));
}
sc.close();
}
public static boolean result(int a,int b,int c,int d){
int i,j,k;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
for(k=0;k<4;k++)
{
if(cal(a,b,c,d,i,j,k)==24) return true;
if(cal(a,b,d,c,i,j,k)==24)return true;
if(cal(a,c,b,d,i,j,k)==24)return true;
if(cal(a,c,d,b,i,j,k)==24)return true;
if(cal(a,d,b,c,i,j,k)==24)return true;
if(cal(a,d,c,b,i,j,k)==24)return true;
if(cal(b,a,c,d,i,j,k)==24)return true;
if(cal(b,a,d,c,i,j,k)==24)return true;
if(cal(b,c,a,d,i,j,k)==24)return true;
if(cal(b,c,d,a,i,j,k)==24)return true;
if(cal(b,d,a,c,i,j,k)==24)return true;
if(cal(b,d,c,a,i,j,k)==24)return true;
if(cal(c,a,b,d,i,j,k)==24)return true;
if(cal(c,a,d,b,i,j,k)==24)return true;
if(cal(c,b,a,d,i,j,k)==24)return true;
if(cal(c,b,d,a,i,j,k)==24)return true;
if(cal(c,d,a,b,i,j,k)==24)return true;
if(cal(c,d,b,a,i,j,k)==24)return true;
if(cal(d,a,b,c,i,j,k)==24)return true;
if(cal(d,a,c,b,i,j,k)==24)return true;
if(cal(d,b,a,c,i,j,k)==24)return true;
if(cal(d,b,c,a,i,j,k)==24)return true;
if(cal(d,c,a,b,i,j,k)==24)return true;
if(cal(d,c,b,a,i,j,k)==24)return true;
}
return false;
}
public static int cal(int m1,int m2,int m3,int m4,int i,int j,int k){
int sum=0;
if(i==0)sum=m1+m2;
else if(i==1)sum=m1-m2;
else if(i==2)sum=m1*m2;
else if(i==3)sum=m1/m2;
if(j==0)sum=sum+m3;
else if(j==1)sum-=m3;
else if(j==2)sum*=m3;
else if(j==3)sum/=m3;
if(k==0)sum+=m4;
else if(k==1)sum-=m4;
else if(k==2)sum*=m4;
else if(k==3)sum/=m4;
return sum;
}
}
另分析:http://www.cnblogs.com/grenet/archive/2013/03/17/2964455.html