今天看了一道面试编程的关于24点游戏的,自己想了想,就写了以下的java代码,时间复杂度比较高,暂时还没有想到太好的方法,希望有人能提出更好地方法。
原题是让随机生成4个数,这四个数大于1小于14,然后计算其能否凑成24点。并输出每个数和方法。源代码如下:
public class Test24Point {
public static float operate(float r1,float r2,int opt){
switch(opt){
default:
case 0:return (float)(r1+r2);
case 1:return (float)r1-r2;
case 2:return (float)r1*r2;
case 3:return (float)r1/r2;
}
}
public static boolean test(int r1,int r2,int r3,int r4){
boolean result=false;
float result1=0;
float result2=0;
float result3=0;
int m=0;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
for (int k=0;k<4;k++){
if(i>1){
result1=operate((float)r1, (float)r2, i);
if(k>1){
result2=operate(r3, r4,k);
result3=operate((float)result1, (float)result2,j);
}else{
result2=operate((float)result1, (float)r3,j);
result3=operate((float)result2, (float)r4, k);
}
}else if(j>1){
result1=operate((float)r2, (float)r3, j);
if(k>1){
result2=operate((float)result1, (float)r4,k);
result3=operate((float)r1, (float)result2, i);
}else{
result2=operate((float)r1,(float)result1,i);
result3=operate((float)result2,(float)r4,k);
}
}else if(k>1){
result1=operate((float)r3, (float)r4, k);
result2=operate((float)r1, (float)r2, i);
result3=operate((float)result1, (float)result2,j);
}else{
result1=operate((float)r1, (float)r2, i);
result2=operate((float)result1, (float)r3, j);
result3=operate((float)result2, (float)r4, k);
}
if(result3==24){
System.out.println("各部的操作符分别为:"+i+j+k);
m++;
result=true;
}
}
}
}
System.out.println("共有"+m+"个"+"可行方案");
return result;
}
public static void main(String[] args){
Random r11=new Random(41);
int r1=r11.nextInt(13)+1;
System.out.println("我打印出的R1的值为:"+r1);
Random r22=new Random(42);
int r2=r22.nextInt(13)+1;
System.out.println("我打印出的R2的值为:"+r2);
Random r33=new Random(43);
int r3=r33.nextInt(13)+1;
System.out.println("我打印出的R3的值为:"+r3);
Random r44=new Random(44);
int r4=r44.nextInt(13)+1;
System.out.println("我打印出的R4的值为:"+r4);
if(test(6, 11, 1, 3)){
System.out.println("此随机数可以凑成24点");
}else{
System.out.println("对不起,没有实现24点");
}
}
}