我必须编写一个代码,它从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;
这错过了很多可能的组合
答案 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
注意:
这里浪费了空间,但这种方法应该有效。