一、题目
现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:□ + □ = □
□ - □ = □
□ × □ = □
□ ÷ □ = □
(如果显示不出来,可以参见【图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就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
二、思路
从除法倒序开始查找,排除掉不可能的情况,一直到加法,因为除法不满足交换律能排除很多情况。
我们给每一个式子,每一个填写数字的位置标号,如图:
(微信截图画质真滴垃圾)
用number[]数组存每个位置的数字,visited[]表示是否已经访问过,index表示每个数位的下标,solutions记录最后算出来的方案总数。
当index进行到4的时候,前面index123的数字已经存在,排除掉不满足的情况,以此类推,一直到index=13,也就是加法结束之后。
三、题解
#include <iostream> using namespace std; int number[14]; int visited[14]={0}; int solutions=0; void dfs(int index) { if(index==4) { if(!(number[1]/number[2]==number[3] && number[1] % number[2]==0)) { return; } } else if (index==7) { if(!(number[4]*number[5]==number[6])) { return; } } else if (index==10) { if(!(number[7]-number[8]==number[9])) { return; } } else if (index==13) { if(number[10]+number[11]==number[12]) { solutions++; } return ; } for (int i=1;i<=13;i++) { if(!visited[i]) { visited[i]=1; number[index]=i; dfs(index+1); visited[i]=0; } } } int main() { dfs(1); cout << solutions << endl; return 0; }
四、结果
64
Process finished with exit code 0