现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:
每个方块代表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个数的全排列会超时,因此再dfs时剪枝,当枚举的四个表达式有一个不满足要求,就返回
#include <iostream>
#include <algorithm>
using namespace std;
int a[13] = {1,2,3,4,5,6,7,8,9,10,11,12,13};
bool st[13];
int res;
void dfs(int u)
{
if (u == 3)
{
if (a[0] + a[1] != a[2])
return;
}
if (u == 6)
{
if (a[3] - a[4] != a[5])
return;
}
if (u == 9)
{
if (a[6] * a[7] != a[8])
return;
}
if (u == 12)
{
if (a[9] == a[10] * a[11]) res++;
return;
}
for (int i = 1 ; i <=13 ; i ++)
{
if (!st[i])
{
st[i] = true;
a[u] = i;
dfs(u + 1);
st[i] = false;
}
}
}
int main()
{
dfs(0);
cout << res << endl;
return 0;
}