趣味编程:24点算法实现

24点游戏规则:任取1-9之间的4个数字,用+-*/()连结成算式,使得式子的计算结果为24。估计很多人都玩过用扑克牌玩的那种,印象中10也算在内的,两人各出2张牌,谁先算出来谁赢,赢家收回已经算过的4张牌。最后看谁手里的牌多。
这个程序实现使用穷举的方法,将所有可能的排列穷举出来,最后将每个排列中计算出结果。计算结果时,将前两个作为一组、后两个数作为一组,分别计算出各组的结果,再对获得的两个组结果进行计算。由于是排列,分前后两组进行计算就可满足所有可能的计算。

[b]改进后的代码见回复中。[/b]


package fun.twentyfour;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class TwentyFour {
public static void main(String[] args){
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line;
try{
while((line=br.readLine())!=null){
try{
if ("exit".equals(line)) break;

String[] s=line.split("\\s");
int[] v=new int[4];
for(int idx=0;idx<4;idx++) {
v[idx]=Integer.parseInt(s[idx]);
if (v[idx]<=0||v[idx]>=10) throw new Exception("Input error.");
}
evaluate(v);

}catch(Exception ex){
ex.printStackTrace();
}
}
}catch(Exception ex){
ex.printStackTrace();
}
}

public static void evaluate(int[] v){
int idx=0;
for(int a=0;a<4;a++)
for(int b=0;b<4;b++)
for (int c=0;c<4;c++)
for (int d=0;d<4;d++){
if (a!=b && a!=c && a!=d && b!=c && b!=d && c!=d){
idx++;
check(v,new int[]{a,b,c,d});
}
}
}
static char[] op={'+','-','*','/'};
public static void check(int[] v,int[] idx){

for(int o=0;o<4;o++){
for(int p=0;p<4;p++){
for(int t=0;t<4;t++){
if (op(op[p],op(op[o],v[idx[0]],v[idx[1]]),op(op[t],v[idx[2]],v[idx[3]]))==24){
System.out.println(String.format("(%1$d %2$c %3$d) %4$c (%5$d %6$c %7$d)",
v[idx[0]],op[o],v[idx[1]],op[p],v[idx[2]],op[t],v[idx[3]]));
}
}
}
}
}

public static int op(char op,int v1,int v2){
switch(op){
case '+':
return v1+v2;
case '-':
return v1-v2;
case '*':
return v1*v2;
case '/':
if (v2==0) return -111;
if (v1%v2!=0) return -111;
return v1/v2;
default:
return 0;
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值