天天看點

3388=24及24點遊戲的窮舉算法

偶爾看到一題:用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

繼續閱讀