一个24点的算法

import java.util.Random;

public class HelloWorld {
        public static String formular;

        public static void main(String[] args) {
            int[] card= new int[4];
            //Generate 4 cards randomly
            int max=13; 
            int min=1;
            Random random = new Random();
            for (int i = 0 ;i<4;i++) {
                int s = random.nextInt(max)%(max-min+1) + min;
                card[i] = s;
                System.out.println("Card " + i + ": " + s);
            }


            if (canCalculate(card[0],card[1],card[2],card[3],24)) {
                System.out.println("formular: " + formular+ "=24");
            } else
            {
                System.out.println("Can't find answer");
            }

        }

        //To check function(a,b,c,d) = result
        public static boolean canCalculate(int a, int b, int c, int d, int result) {
            int[] input = {a,b,c,d};
            for (int i=0; i<4; i++) {
                //other input index
                int index1 = i+1>3?i-3:i+1;
                int index2 = i+2>3?i-2:i+2;
                int index3 = i+3>3?i-1:i+3;
                //Scenario 1: input[i]+function(other inputs)
                if (input[i] <= result) {
                    if (canCalculate(input[index1], input[index2], input[index3], result-input[i])) {
                        formular=input[i] + "+(" + formular + ")";
                        return true;
                    }
                }

                //Scenario 2: input[i]-function(other inputs)
                if (input[i] > result) {
                    if (canCalculate(input[index1], input[index2], input[index3], input[i]-result)) {
                        formular = input[i] + "-(" + formular + ")";
                        return true;
                    }
                }

                //Scenario 3: input[i] * function(other inputs)
                if (result%input[i] == 0 ) {
                    if (canCalculate(input[index1], input[index2], input[index3], result/input[i])) {
                        formular=input[i] + "*(" + formular + ")";
                        return true;
                    }
                }

                //Scenario 4: input[i] / function(other inputs)
                if (input[i]%result == 0 ) {
                    if (canCalculate(input[index1], input[index2], input[index3], input[i]/result)) {
                        formular=input[i] + "/(" + formular + ")";
                        return true;
                    }
                }
            }
            return false;
        }
        //To check function(a,b,c) = result
        public static boolean canCalculate(int a, int b, int c, int result) {
            int[] input = {a,b,c};
            for (int i=0; i<3; i++) {
                //Scenario 1: input[i]+function(other inputs)
                if (input[i] <= result) {
                    if (canCalculate(input[i+1>2?i-2:i+1], input[i+2>2?i-1:i+2], result-input[i])) {
                        formular=input[i] + "+(" + formular + ")";
                        return true;
                    }
                }

                //Scenario 2: input[i]-function(other inputs)
                if (input[i] > result) {
                    if (canCalculate(input[i+1>2?i-2:i+1], input[i+2>2?i-1:i+2], input[i]-result)) {
                        formular = input[i] + "-(" + formular + ")";
                        return true;
                    }
                }

                //Scenario 3: input[i] * function(other inputs)
                if (result%input[i] == 0 ) {
                    if (canCalculate(input[i+1>2?i-2:i+1], input[i+2>2?i-1:i+2], result/input[i])) {
                        formular=input[i] + "*(" + formular + ")";
                        return true;
                    }
                }

                //Scenario 4: input[i] / function(other inputs)
                if (input[i]%result == 0 ) {
                    if (canCalculate(input[i+1>2?i-2:i+1], input[i+2>2?i-1:i+2], input[i]/result)) {
                        formular=input[i] + "/(" + formular + ")";
                        return true;
                    }
                }
            }
            return false;
        }

        //To check function(a,b) = result
        public static boolean canCalculate(int a, int b, int result) {

            if (a+b==result) {
                formular = a + "+" + b ;
                return true;
            }
            if (a*b==result)  {
                formular = a + "*" + b ;
                return true;
            }

            if (a-b==result) {
                formular = a + "-" + b ;
                return true;
            }

            if (a/b==result & a%b == 0) {
                formular = a + "/" + b ;
                return true;
            }
            if ((b-a) == result) {
                formular = b + "-" + a ;
                return true;
            }
            if (b/a==result & b%a==0) {
                formular = b + "/" + a ;
                return true;
            }
            return false;
        }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值