简体   繁体   中英

Can 5 numbers equal a target number using addition, subtraction, or multiplication

I'm working on a game, much like the Math Dice problem, albeit a bit different. The user rolls a 20 sided die, then 5 more dice following that. To make things simpler, the user cannot reorder the dice, so if they roll 1 2 3 4 5 , they can't do operations like 1 + 3 + 2 + 5 + 4 . The question is if, using addition, subtraction, and multiplication, can they reach the target number from the 20 sided die?

Now, I know how to do this, just generate a permutation of all possible addition, subtraction, and multiplication of the 5 numbers, but it's the implementing of the solution that's getting me. I've hit a roadblock after a couple tries, so any help is appreciated.

edit: This is my current implementation, without the multiplication, and it isn't working quite right.

import java.util.ArrayList;
import java.util.Scanner;


public class targetDice {

public static void main(String[] args) {
    ArrayList<Integer> rolls = new ArrayList<Integer>(); // Array to hold the rolls
    ArrayList<Integer> d20 = new ArrayList<Integer>(); // Array to hold all the d20 rolls
    Scanner sc = new Scanner(System.in);
    int answer = 0;
    String record = "";

    while (sc.hasNextInt()) {
        d20.add(sc.nextInt());   // Adds the d20 rolls
        rolls.add(sc.nextInt()); // Adds the first roll
        rolls.add(sc.nextInt()); // Adds the second roll
        rolls.add(sc.nextInt()); // Adds the third roll
        rolls.add(sc.nextInt()); // Adds the fourth roll
        rolls.add(sc.nextInt()); // Adds the fifth roll
    } // End while loop


    for (int i = 0; i < d20.size(); i++) { // Number of times we need to compute: number of d20 rolls
        answer = rolls.get(0);
        for (int j = 0; j < rolls.subList(0, 5).size(); j++) { // Go through each roll given
            if (d20.get(i) > answer || d20.get(i).equals(answer)) { // If the d20 roll is higher than the first roll or if it's equal
                answer += rolls.get(j);// then take the running total and add it
                record += " + ";
            } else if (d20.get(i) < answer) {
                answer -= rolls.get(j);
                record += " - ";
            }
        }

        System.out.println(answer);

        //TODO: This if else block is our final product. It should be fine.
        if (answer == d20.get(i)) // If the combo is equal the d20 roll
            System.out.println("Solution"); // Print solution
        else
            System.out.println("No Solution"); // Otherwise print no solution

        rolls.subList(0, 5).clear(); // Clears out the first 5 elements to make coding easier
        answer = 0; // Reset the answer var
        System.out.println(record);
    } // End For loop
} // End main
} // End class

It's set up so that the user can do the rolls more than once, if they were to try this game 3 times, they can do all three then get all three answers at once.

If you want to see it in a different way, here's the pastebin: http://pastebin.com/PRB0NKpN

edit 2: Here's my final solution. A bit bruce-forcey.

import java.util.ArrayList;
import java.util.Scanner;


public class testClass {
public static void main(String[] args) {
    ArrayList<Integer> d20 = new ArrayList<Integer>();
    ArrayList<Integer> rolls = new ArrayList<Integer>();
    Scanner sc = new Scanner(System.in);

    while (sc.hasNextInt()) {
        d20.add(sc.nextInt());
        rolls.add(sc.nextInt());
        rolls.add(sc.nextInt());
        rolls.add(sc.nextInt());
        rolls.add(sc.nextInt());
        rolls.add(sc.nextInt());
    }

    int num1 = 0, num2 = 0, num3 = 0, num4 = 0;

    for (int x = 0; x < d20.size(); x++) {
        int wright = 0, rong = 0;

        for (int i = 1; i < 4; i++) {
            for (int j = 1; j < 4; j++) {
                for (int k = 1; k < 4; k++) {
                    for (int m = 1; m < 4; m++) {
                        if (i == 1) {
                            num1 = rolls.get(0) + rolls.get(1);
                        } else if (i == 2) {
                            num1 = rolls.get(0) - rolls.get(1);
                        } else if (i == 3) {
                            num1 = rolls.get(0) * rolls.get(1);
                        }
                        if (j == 1) {
                            num2 = num1 + rolls.get(2);
                        } else if (j == 2) {
                            num2 = num1 - rolls.get(2);
                        } else if (j == 3) {
                            num2 = num1 - rolls.get(2);
                        }
                        if (k == 1) {
                            num3 = num2 + rolls.get(3);
                        } else if (k == 2) {
                            num3 = num2 - rolls.get(3);
                        } else if (k == 3) {
                            num3 = num2 * rolls.get(3);
                        }
                        if (m == 1) {
                            num4 = num3 + rolls.get(4);
                        } else if (m == 2) {
                            num4 = num3 - rolls.get(4);
                        } else if (m == 3) {
                            num4 = num3 * rolls.get(4);
                        }

                        if (d20.get(x) == num4) {
                            wright = 1;
                        }
                    }
                }
            }
        }
        if (wright == 1)
            System.out.println("Case " + (x+1) + ": Solution");
        else
            System.out.println("Case " + (x+1) + ": No Solution");

        rolls.subList(0, 5).clear();
    }
}
}

I see you find answer by yourself, but I also tried to solve your problem, and I decide to post here an another solution in any case:

import java.util.ArrayList;
import java.util.Scanner;

public class Test {
    public static void main(String[] args){
        Test test = new Test();
        test.combineOperators();
        Scanner scanner = new Scanner(System.in);

        int result = scanner.nextInt();       //get input
        int[] numbers = new int[5];
        for(int i = 0; i <5; i++){
            numbers[i] = scanner.nextInt();
        }

        ArrayList<Integer> results = test.operationsOnArrays(numbers, test.combineOperators());         //check for results
        if(results.contains(result)){
            System.out.println(result + " is a possible solution");
        }else{
            System.out.println(result + " is not a possible solution");
        }

    }
    public ArrayList<String[]> combineOperators(){             //create all possible combinations of operators
        String[] signs = {"+","-","*"};
        ArrayList<String[]> combinations = new ArrayList<String[]>();
        for(String a : signs){
            for (String b : signs){
                for(String c : signs){
                    for(String d: signs){
                            String[]temp = {a,b,c,d};
                            combinations.add(temp);
                    }
                }
            }
        }
        return  combinations;
    }

    public ArrayList operationsOnArrays(int[] num, ArrayList<String[]> combinations){   //do the math with every combination on given ints
        ArrayList<Integer> list = new ArrayList<Integer>();
        for(String[] operators : combinations){         //for every operators combination
            int result = num[0];
            for(int i = 0; i<=3 ; i++){
                result = doTheMath(operators[i],result,num[i+1]);      // take two ints and operator
            }
            list.add(result);
        }
        return list;
    }

    public int doTheMath(String operator, int prev, int next){   // it take two ints from input array, and do operation
        if(operator.equals("+")){                                // determined by a taken operator
            return prev + next;
        }else  if(operator.equals("-")){
            return prev - next;
        }else if(operator.equals("*")){
            return prev  *next;
        }
        return 0;
    }
}

I think that this way, it is vary simple to expand, for more numbers or operator, or even to implement reordering of input numbers.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM