偶爾看到一題:用3 3 8 8 四個數和加減乘除組合得出24,前提是用完這四個數,幾年沒好好思考了,偶算了半天沒答案,就寫了個窮舉算法,呵呵,貌似結果隻有一種啊,各位兄台還有其它答案麼?
package my;
public class DigitalPuzzle {
private float[] operands=new float[]{3.0f, 3.0f, 8.0f, 8.0f};
private int[] operators=new int[]{0, 1, 2, 3};//0 1 2 3 stand for + - * /
private float[][] allSeries=new float[4][4*4*4*4]; //四個操作數所有可能的組合
private int[][] allOperats=new int[3][4*4*4]; //三個操作符所有可能的組合
private int validSeriesSum=0; //有效的操作數組合個數
// 窮舉所有的操作數排列及操作符排列
public void init(){
int i,j,m,n;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
for(m=0;m<4;m++){
allOperats[0][i*16+j*4+m]=operators[i];
allOperats[1][i*16+j*4+m]=operators[j];
allOperats[2][i*16+j*4+m]=operators[m];
}
int kk=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
for(m=0;m<4;m++)
for(n=0;n<4;n++)
if(i!=j && i!=m && i!=n && j!=m && j!=n && m!=n){
allSeries[0][kk]=operands[i];
allSeries[1][kk]=operands[j];
allSeries[2][kk]=operands[m];
allSeries[3][kk]=operands[n];
kk++;
}
validSeriesSum=kk;
}
public float Calcu(float op1, float op2, int op){
switch(op){
case 0: return op1+op2;
case 1: return op1-op2;
case 2: return op1*op2;
case 3: return op1/op2;
default:
return 0.0f;
}
}
// 列印計算結果
public String show(float op[], int opt[], int result){
String[] opts=new String[opt.length];
for(int i=0;i<opt.length;i++)
switch(opt[i]){
case 0: opts[i]="+";break;
case 1: opts[i]="-";break;
case 2: opts[i]="*";break;
case 3: opts[i]="/";break;
default:
opts[i]="wrong";
}
return op[3]+opts[2]+"("+op[2]+opts[1]+"("+op[1]+opts[0]+op[0]+")) = "+result;
}
// 窮舉過程
public void find(){
for(int i=0;i<validSeriesSum;i++)
for(int j=0;j<4*4*4;j++){
float tmp1=Calcu(allSeries[1][i], allSeries[0][i],allOperats[0][j]);
float tmp2=Calcu(allSeries[2][i], tmp1, allOperats[1][j]);
float tmp3=Calcu(allSeries[3][i], tmp2, allOperats[2][j]);
if(Math.abs(tmp3-24.0f)<0.01f)
System.out.println(show(new float[]{allSeries[0][i],allSeries[1][i],
allSeries[2][i],allSeries[3][i]},new int[]{allOperats[0][j],
allOperats[1][j],allOperats[2][j]}, 24));
}
}
public static void main(String[] args){
DigitalPuzzle dp=new DigitalPuzzle();
dp.init();
dp.find();
}
}
列印結果: 8.0/(3.0-(8.0/3.0)) = 24