下图中,每个方块代表 1…13
中的某一个数字,但不重复。
例如:
1×2+9×7=13×5
10×8−12×3=11×4
只要有任意一个方块代表的数字不同,就算两种不同的方案。
请你计算,一共有多少种不同的方案。
#include <stdio.h>
int a[10];
int f[14];
int c=0;
void dfs(int step){
if(step==5){
int result1 = a[0]*a[1]+a[2]*a[3];
int a1 = result1/a[4];
if(f[a1]||a1>13||a1<1)
return;//剪枝
}
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]){
c++;
}
}
return;
}
int i;
for(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;
}