a+b+c+d+e = e+d+f+g+h = h+g+k+b+a
每个变量[a..k]介于[1-9]之间,每个变量必须获得 唯一编号。
必须使用1-9 之间的每个数字。
必须找到所有 posibilites。 (语言是C)
上述方程式应按说明解决。我甚至无法开始考虑某种算法来寻找解决方案。如果有人帮助/指导我解决方案,我会指出它。这不是一个功课,我只是试图挑战自己,但在这里我甚至没有代码片段..我不是完整的代码或长解释。我只是想要一些指南或建议来寻找解决方案。
编辑:我有蛮力算法找到解决方案。我想以更好的方式做到这一点。答案 0 :(得分:1)
由于蛮力总是一个选项,你可以尝试以下方法:
编写一个函数int check(int foo[])
,它接受一个整数数组并检查您的公式是否成立。 foo[0]
保存a的值,foo[1]
保存b的值,等等。
生成所有可能的数组组合并打印int check(int foo[])
保留的组合。
编辑:之后聊天中的问题已“解决”。
以下代码通过递归生成所有可能的数组组合,并检查公式是否满足。如果是这种情况,则计数器递增。找到的组合数为864.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int check();
void rec(int);
void swap(int, int);
int foo[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int match = 0;
int main(void)
{
rec(-1);
printf("%d combinations have been found", match);
return(0);
}
// generate all possible combinations for the array foo
void rec(int fix)
{
if(fix == 8) { // base case
if(check() == 1){
match++;
}
} else { // inductive step
int i;
for(i = fix + 1; i < 9; i++){
swap(fix + 1, i);
rec(fix + 1);
swap(fix + 1, i);
}
}
}
// swap position i with j in array foo
void swap(int i, int j)
{
int v = foo[i];
foo[i] = foo[j];
foo[j] = v;
}
// check whether the condition holds
int check()
{
int f1 = foo[0]+foo[1]+foo[2]+foo[3]+foo[4]; // a+b+c+d+e
int f2 = foo[4]+foo[3]+foo[5]+foo[6]+foo[7]; // e+d+f+g+h
int f3 = foo[7]+foo[6]+foo[8]+foo[1]+foo[0]; // h+g+k+b+a
return ((f1 == f2) && (f2 == f3));
}