蓝桥杯 寒假作业(全排列)

第二题:寒假作业

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

蓝桥杯 寒假作业(全排列)_第1张图片

每个方块代表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

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

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


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

 

思路:由题可知,题中的序列是固定的,只有1-13这13个元素,所以可以枚举这13个元素的全部全排列,对每个排列根据条件进行筛选。但是13个数字的全排列运算时间非常长,等一个小时左右可以出结果。。。

易错点:除法应该转换为乘法,因为int数作除法会丢掉结果的小数部分,导致错误结果。

 1 #include 
 2 #include <string>
 3 #include <set>
 4 #include 
 5 #include 
 6 
 7 using namespace std;
 8 
 9 int main()
10 {
11     vector<int> v;
12     for (int i = 1; i <= 13; ++i)
13         v.push_back(i);
14 
15     int cnt = 0;
16     do
17     {
18         if (v[0] + v[1] == v[2] && v[3] - v[4] == v[5] && v[6] * v[7] == v[8] && v[9] == v[10] * v[11]) //此处要转换为乘法,因为int数作除法会去除小数部分,导致错误结果
19             cnt++;
20     } while (next_permutation(v.begin(), v.end()));
21 
22     cout << cnt << endl;
23 
24     return 0;
25 }

思路二:dfs,请参考:https://www.cnblogs.com/FengZeng666/p/10461885.html

最终答案: 64

转载于:https://www.cnblogs.com/FengZeng666/p/10547875.html

你可能感兴趣的:(蓝桥杯 寒假作业(全排列))