数组中4个整数的排列?

时间:2014-12-01 22:05:58

标签: java arrays integer permutation

我必须编写一个代码,它从Scanner对象中获取1到9之间的4个整数的输入,并以任何方式将它们组合到24个。尽管我的解决方案不是最优雅的,但我设法编译了一些if语句使用变量b,c,d并希望将用户输入的数字存储在数组中并交换a,b,c,d的值以生成每个可能的数字组合

例如,一个配对可能是 (a + b * c) - d = 24.我想为所有可能的组合切换a,b,c,d的值,对于我的生活,我无法弄清楚如何做到这一点。这就是我所拥有的

public static void daGame(int a, int b, int c, int d) {
    int[] baseArray = {a, b, c, d};
    int [] keyArray = baseArray.clone();

    if(a > 9 || b > 9 || c > 9 || d > 9 || a == 0 || b == 0 || c == 0 || d == 0){
        System.out.println("You entered a number greater than 9 or you enterered 0:");
        main(null);
        System.exit(0);
    }

    for(int i = 0; i < 2; i++){
        for(int j = 0; j < baseArray.length; j++){
            if(i == 1){
            baseArray = keyArray.clone();
            int temp = baseArray[0];
            baseArray[0] = baseArray[3];
            baseArray[3] = temp;
            j = baseArray.length - 1;
            }
            else if (i == 2){
            baseArray = keyArray.clone();
            int temp = baseArray[1];
            baseArray[1] = baseArray[0];
            baseArray[0] = temp;
            temp = baseArray[2];
            baseArray[2] = baseArray[3];
            baseArray[3] = temp;
            j = baseArray.length - 1;
            }else{
            int temp = baseArray[j];
            baseArray[j] = baseArray[baseArray.length - (1+j)];
            baseArray[baseArray.length - (1+j)] = temp;

这错过了很多可能的组合

1 个答案:

答案 0 :(得分:0)

这是一种方法。只需对算术运算和数字使用permutation方法。

一旦你有来自用户的输入就把它们变成一个字符串:

void perm(std::string str, std::vector<std::string> &vec){
   perm("", str, vec);
}

void perm(std::string prefix, std::string str, std::vector<std::string &vec){
   int n = str.length();
   if( n == 0 ) vec.push_back(str);
   for(int i = 0; i < n; i++){
      perm(pre+ str[i], str.substr(0,i) + str.substr(i+1,n), vec);
   }
}

现在你有了一个排列方法,让我们说你输入了一个字符串:1234,你可以置换该字符串以获得2134 3214 1243 ... etc

你也可以用算术运算做同样的事情,即+-*/

或者您可以合并操作:

std::vector<std::string> vec;
perm("1234" + "*-/+", vec);

现在你有一个包含所有数字和操作的向量的向量。 您现在可以将列表修剪为仅接受number operation number operations。 这可以使用正则表达式完成:

 `\d[*|+|-|/]\d[*|+|-|/]\d[*|+|-|/]\d[*|+|-|/]`
 Then disregard the last operation.

现在您已将所有排列设为strings。创建一些逻辑以将其转回ints

注意:
这里浪费了空间,但这种方法应该有效。