2016年蓝桥杯A组 第六题 寒假作业

来源:互联网 发布:bat软件测试招聘 编辑:程序博客网 时间:2024/05/18 03:55
今年的题不知为什么,第三道是考的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 13int 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!!!
1 0
原创粉丝点击