今年的题不知为什么,第三道是考的dfs,这第六道同样是考的dfs,看来深度优先遍历是需要好好学学的!

寒假作业

现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:

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

(如果显示不出来,可以参见【图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

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

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

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

这里我们很直观就可以想到用dfs,所以就不多分析了,直接上代码了,感觉通过这两道题,让我对dfs的感觉更到位了!

对,就是这个赶脚!跟着赶脚走,学算法是很快的,哈哈哈!

#include <stdio.h>
#define _MAX 13

int ans = 0;
int num[_MAX] = {
  0};
int visited[_MAX] = {
  0};

int test(int n)
{
    if (n == 2)
    {
        if (num[0] + num[1] == num[2])
        {
            return 1;
        }
    }
    else if (n == 5)
    {
        if (num[3] - num[4] == num[5])
        {
            return 1;
        }
    }
    else if (n == 8)
    {
        if (num[6] * num[7] == num[8])
        {
            return 1;
        }
    }
    else if (n == 11)
    {
        if (num[10] * num[11] == num[9])
        {
            ans++;
            return 1;
        }
    }
    else
    {
        return 1;
    }
    return 0;
}

void dfs(int n)
{
    int i = 0;
    if (n >= _MAX)
    {
        return ;
    }
    for (; i < _MAX; i++)
    {
        if (!visited[i])
        {
            visited[i] = 1;
            num[n] = i + 1;
            if (!test(n))   //如果不符合规则,则撤销这个分支
            {
                visited[i] = 0;
                continue;
            }
            dfs(n + 1);
            visited[i] = 0;
        }
    }
    return ;
}

int main(int argc, const char * argv[])
{
    dfs(0);
    printf("%d\n", ans);
    return 0;
}
OVER!!!