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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值