【2星难度】蓝桥杯真题 寒假作业
题目:
现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:
□ + □ = □
□ - □ = □
□ × □ = □
□ ÷ □ = □
每个方块代表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;递归深度为方格的个数,每个方格填数有13种选择:1-13,递归出口为填完第12个方格,判断条件是满足运算
答案:64
Code:
//寒假作业
#include<bits/stdc++.h>
using namespace std;
#define INF 999999
int val[13];
int cnt = 0;
bool used[15];
bool alright(int idx, int n){
if(idx % 3 != 0) return true;
switch(idx / 3){
case 1:{
if(val[1] + val[2] == n) return true;
else return false;
break;
}
case 2:{
if(val[4] - val[5] == n) return true;
else return false;
break;
}
case 3:{
if(val[7] * val[8] == n) return true;
else return false;
break;
}
case 4:{
if(val[11] * n == val[10]) return true;
else return false;
break;
}
}
}
void dfs(int idx){
if(idx == 13){
cnt++;
return ;
}
for(int i = 1; i <= 13; ++i){
if(!used[i] && alright(idx,i)){
used[i] = true;
val[idx] = i;
dfs(idx + 1);
used[i] = false;
val[idx] = -INF;
}
}
}
int main(){
memset(used,false,sizeof(used));
dfs(1);
cout<<cnt<<endl;
return 0;
}