簡體   English   中英

5個數字可以通過加,減或乘運算等於目標數字

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

盡管有些不同,但我正在開發類似於Math Dice問題的游戲。 用戶擲出20個雙面骰子,然后再擲5個骰子。 為了簡化操作,用戶無法重新排序骰子,因此如果擲出1 2 3 4 5 ,他們將無法執行1 + 3 + 2 + 5 + 4 問題是,通過加,減和乘運算,它們是否可以從20面模具中達到目標數量?

現在,我知道如何執行此操作,只需生成5個數字的所有可能加法,減法和乘法的置換,但這正是解決方案的實現使我着迷的。 經過幾次嘗試,我遇到了障礙,因此我們將為您提供任何幫助。

編輯:這是我當前的實現,沒有乘法,並且運行不正常。

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

設置它的目的是使用戶可以多次進行擲骰,如果他們要嘗試3次此游戲,則可以完成全部三個操作,然后一次獲得所有三個答案。

如果您想以其他方式查看它,請參閱以下pastebin: http : //pastebin.com/PRB0NKpN

編輯2:這是我的最終解決方案。 有點強力。

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();
    }
}
}

我看到您自己找到了答案,但是我也試圖解決您的問題,因此無論如何我決定在此處發布另一種解決方案:

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;
    }
}

我認為,通過這種方式,可以輕松擴展,添加更多的數字或運算符,甚至實現輸入數字的重新排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM