算法设计与分析: 5-23 算24点问题

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

王晓东《计算机算法设计与分析》

猜你喜欢

转载自blog.csdn.net/ioio_/article/details/81143270