现在小学的数学题目也不是那么好玩的。

看看这个寒假作业:

   □ + □ = □
   □ - □ = □
   □ × □ = □
   □ ÷ □ = □

(如果显示不出来,可以参见【图1.jpg】)

每个方块代表1~13中的某一个数字,但不能重复。

比如:

 6  + 7 = 13
 9  - 8 = 1
 3  * 4 = 12
 10 / 2 = 5

以及:

 7  + 6 = 13
 9  - 8 = 1
 3  * 4 = 12
 10 / 2 = 5

就算两种解法。(加法,乘法交换律后算不同的方案)

你一共找到了多少种方案?

请填写表示方案数目的整数。

注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

答案 (8分)

 

dfs+剪枝

代码:

#include <iostream>
#include <cstdio>

using namespace std;
int s[12],c;
bool vis[14];

void dfs(int k) {
    if(k == 3 && s[0] + s[1] != s[2]) return;
    if(k == 6 && s[3] - s[4] != s[5]) return;
    if(k == 9 && s[6] * s[7] != s[8]) return;
    if(k >= 12) {
        if(s[9] % s[10] == 0 && s[9] / s[10] == s[11]) c ++;
        return;
    }
    for(int i = 1;i <= 13;i ++) {
        if(!vis[i]) {
            vis[i] = true;
            s[k] = i;
            dfs(k + 1);
            vis[i] = false;
        }
    }
}
int main() {
    dfs(0);
    printf("%d",c);
}

 

public class Main {
    private static int [] s = new int[13];
    private static int c = 0;
    private static boolean [] vis = new boolean[14];
    private static void dfs(int k) {
        if(k == 3 && s[0] + s[1] != s[2]) return;
        if(k == 6 && s[3] - s[4] != s[5]) return;
        if(k == 9 && s[6] * s[7] != s[8]) return;
        if(k == 12 && (s[9] % s[10] != 0 || s[9] / s[10] != s[11])) return;
        if(k == 12) {
            c ++;
            return;
        }
        for(int i = 1;i <= 13;i ++) {
            if(vis[i]) continue;
            vis[i] = true;
            s[k] = i;
            dfs(k + 1);
            vis[i] = false;
        }
    }
    public static void main(String[] args) {
        dfs(0);
        System.out.println(c);
    }
}