题目描述:
下图中,每个方块代表 1…13 中的某一个数字,但不重复。
例如:
1×2+9×7=13×5
10×8-12×3=11×4
只要有任意一个方块代表的数字不同,就算两种不同的方案。
请你计算,一共有多少种不同的方案。
思路:我们可以看到12个空13个可选值,很明显暴力啥的会要等很久才会有结果,所以这里需要有点小技巧,我们遍历前5个空吧,最后一个空可以通过前5个空计算出,第二排也类似。这样可以少枚举2个空。。过程可以小剪枝,随便你,没剪枝大概10-20s出结果,也算比较慢了。
代码:
int a[10];
int f[14];
int c=0;
void dfs(int step){
if(step==10){
int result1 = a[0]*a[1]+a[2]*a[3];
int result2 = a[5]*a[6]-a[7]*a[8];
if(result1%a[4]==0&&result2%a[9]==0){
int a1 = result1/a[4];
int a2 = result2/a[9];
if(a1<=13&&a1>=1&&a2<=13&&a2>=1&&a1!=a2&&!f[a1]&&!f[a2]){
//printf("%dX%d+%dX%d=%dX%d\n",a[0],a[1],a[2],a[3],a[4],a1);
//printf("%dX%d-%dX%d=%dX%d\n",a[5],a[6],a[7],a[8],a[9],a2);
c++;
}
}
return;
}
for(int i = 1;i<=13;i++){
if(!f[i]){
f[i] = 1;
a[step] = i;
dfs(step+1);
f[i] = 0;
a[step] = 0;
}
}
}
int main(){
dfs(0);
printf("%d",c);//122368
return 0;
}