现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:
□ + □ = □
□ - □ = □
□ × □ = □
□ ÷ □ = □
(如果显示不出来,可以参见【图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
就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?
该题属于深度优先搜索(DFS)
#include<iostream>
#include"cstdlib"
using namespace std;
int num[13]= {0},count=0,visited[13]= {0};
int test(int n) {
if(n==2) {
if(num[0]+num[1]==num[2])
return 1;
} else if(n==5) {
if(num[3]-num[4]==num[5])
return 1;
} else if(n==8) {
if(num[6]*num[7]==num[8]) {
return 1;
}
} else if(n==11) {
if(num[9]==num[11]*num[10]) {//这里很重要,如果是两者相除会有很多答案
count++;
return 1;
}
} else {
return 1;
}
return 0;
}
void DFS(int n) {
int i=0;
if(n>=13) {
return ;
}
for(; i<13; i++) {
if(!visited[i]) {
visited[i]=1;
num[n]=i+1;
if(!test(n)) {//如果不符合要求即剪枝
visited[i]=0;
continue;
}
DFS(n+1);
visited[i]=0;
}
}
return ;
}
int main() {
DFS(0);
cout<<count;
system("pause");
return 0;
}