3Sum like算法查找方程

时间:2016-04-19 12:03:36

标签: c

enter image description here

a+b+c+d+e = e+d+f+g+h = h+g+k+b+a

每个变量[a..k]介于[1-9]之间,每个变量必须获得 唯一编号。

必须使用1-9 之间的每个数字

必须找到

所有 posibilites。 (语言是C)

上述方程式应按说明解决。我甚至无法开始考虑某种算法来寻找解决方案。如果有人帮助/指导我解决方案,我会指出它。这不是一个功课,我只是试图挑战自己,但在这里我甚至没有代码片段..我不是完整的代码或长解释。我只是想要一些指南或建议来寻找解决方案。

编辑:我有蛮力算法找到解决方案。我想以更好的方式做到这一点。

1 个答案:

答案 0 :(得分:1)

由于蛮力总是一个选项,你可以尝试以下方法:

  1. 编写一个函数int check(int foo[]),它接受​​一个整数数组并检查您的公式是否成立。 foo[0]保存a的值,foo[1]保存b的值,等等。

  2. 生成所有可能的数组组合并打印int check(int foo[])保留的组合。

  3. 编辑:之后聊天中的问题已“解决”。

    以下代码通过递归生成所有可能的数组组合,并检查公式是否满足。如果是这种情况,则计数器递增。找到的组合数为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));
    }