5-23 算24点问题
问题描述
给定 4 个正整数,用算术运算符“+”,“-”,“*”,“/”将这 4 个正整数连接起来,使最终的得数恰为 24。
对于给定的 4 个正整数,给出计算 24 的算术表达式。
数据输入:
第一行有 4 个正整数。
Java
package Chapter5HuiSuFa;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
public class Suan24Dian {
private static double[] d;
private static boolean found;
private static Set<String> answer;
private static double[][] r;
public static void main(String[] args){
Scanner input = new Scanner(System.in);
while (true){
r = new double[4][5];
d = new double[5];
answer = new HashSet<>();
for(int i=1; i<=4; i++)
d[i] = input.nextDouble();
found = false;
search(4,d);
Iterator<String> it = answer.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
if(!found)
System.out.println("No answer!");
}
}
private static void search(int k, double[] d){
int i,j,m,t;
double a, b;
double[] e = new double[5];
if(k == 1){
if((int)((d[1]-24)*10000) == 0){
outanswer();
found = true;
}
}else {
for(i=1; i<=k-1; i++)
for(j=i+1; j<=k; j++){
a = d[i];
b = d[j];
if(a < b) {double tmp=a;a=b;b=tmp;}
for(m=1,t=0; m<=k; m++)
if(m!=i && m!=j)
e[++t] = d[m];
r[5-k][1] = a;
r[5-k][3] = b;
r[5-k][4] = -1;
for(m=1; m<=5; m++){
switch (m){
case 1: r[5-k][4]=a+b; break;
case 2: r[5-k][4]=a-b; break;
case 3: r[5-k][4]=a*b; break;
case 4: if(b!=0) r[5-k][4]=a/b; break;
case 5: if(a!=0) r[5-k][4]=b/a; break;
}
r[5-k][2] = m;
if(r[5-k][4] != -1){
e[t+1] = r[5-k][4];
search(k-1,e);
}
}
}
}
}
private static void outanswer(){
StringBuffer msg = new StringBuffer();
for(int i=1; i<=3; i++){
switch ((int)(r[i][2])){
case 1: msg.append((int)r[i][1]+"+"+(int)r[i][3]); break;
case 2: msg.append((int)r[i][1]+"-"+(int)r[i][3]); break;
case 3: msg.append((int)r[i][1]+"*"+(int)r[i][3]); break;
case 4: msg.append((int)r[i][1]+"/"+(int)r[i][3]); break;
case 5: msg.append((int)r[i][3]+"/"+(int)r[i][1]); break;
}
msg.append("="+(int)r[i][4]+"; ");
}
String ans = new String(msg);
if(!answer.contains(ans))
answer.add(ans);
}
}
Input & Output
1 2 3 7
7+2=9; 9-1=8; 8*3=24;
2-1=1; 7+1=8; 8*3=24;
7-1=6; 6+2=8; 8*3=24;
7*3=21; 2+1=3; 21+3=24;
7*3=21; 21+2=23; 23+1=24;
2+1=3; 7*3=21; 21+3=24;
7*3=21; 21+1=22; 22+2=24;
3 3 3 3
3*3=9; 9*3=27; 27-3=24;
Reference
王晓东《计算机算法设计与分析》