寒假作业
现在小学的数学题目也不是那么好玩的。 看看这个寒假作业:
□ + □ = □
□ - □ = □
□ × □ = □
□ ÷ □ = □
每个方块代表 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
就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?
64
思路 :
给每个空格编个号,然后对这里面的数进行更改,由于题目确定了数,相当于就是13个数的全排列填入空格,看是否满足要求
注意最后一个式子要保证整除
单纯的全排列,等个三分钟左右就能出答案
AC代码
#include<iostream>
#include<algorithm>
using namespace std;
int a[15];
int ans;
int main(){
IOS;
for(int i = 1 ; i <= 13 ; i++) a[i] = i;
do{
if(a[1] + a[2] == a[3]){
if(a[4] - a[5] == a[6]){
if(a[7] * a[8] == a[9]){
if(a[10] == a[11] * a[12]){
ans++;
}
}
}
}
}while(next_permutation(a + 1,a + 14));
cout << ans << endl;
return 0;
}
dfs
#include<iostream>
#include<algorithm>
using namespace std;
int a[14],vis[14];
int ans;
void dfs(int l,int r) //l代表当前赋值的位置
{
if(l == r){
ans++;
return ;
}
if(l >= 4 && a[1] + a[2] != a[3]) return ; //第一个式子不满足
if(l >= 7 && a[4] - a[5] != a[6]) return ; //第二个式子不满足
if(l >= 10 && a[7] * a[8] != a[9]) return ;//第三个式子不满足
if(l >= 13 && a[10] != a[11] * a[12]) return ;//第四个式子不满足
for(int i = 1 ; i < r ; i++){
if(vis[i]) continue; //用过这个数就跳过
a[l] = i; //给l位置赋值
vis[i] = 1;
dfs(l + 1,r); //下一个位置
vis[i] = 0; //回溯,这个位置不用这个数
}
}
int main(){
dfs(1,14);
cout << ans << endl;
return 0;
}