下图中,每个方块代表 1…13 中的某一个数字,但不重复。
例如:
1×2+9×7=13×5
10×8+12×3=11×4
只要有任意一个方块代表的数字不同,就算两种不同的方案。
请你计算,一共有多少种不同的方案。
//这段代码主要用了dfs和剪枝,剪枝是为了避免不必要的循环而浪费时间,当时做的时候没用剪枝,结果运行了快10分钟,剪完枝之后五秒左右
#include <iostream>
using namespace std;
int sum=0;
void dfs(int *a,int *b,int step,int num)
{
if(step==12&&a[6]*a[7]-a[8]*a[9]==a[10]*a[11])//判断是否符合第二个等式,符合则
{
sum+=1;
}
else
{
step+=1;
b[num]=1;
for(int i=0;i<13;i++)
{
if(step>12||b[i]==1)
{
continue;
}
a[step]=i+1;
if(step==5&&a[0]*a[1]+a[2]*a[3]!=a[4]*a[5])//先剪枝一次,判断是否符合第一个等式,不符合则不再进行后面的排序
{
continue;
}
dfs(a,b,step,i);
}
b[num]=0;
}
}
int main()
{
int a[13]={0};
int b[13]={0};
for(int i=0;i<13;i++)
{
a[0]=i+1;
dfs(a,b,0,i);//第一个参数数组表示存储的数字,第二个参数数组是为了标记第一个数组中出现的数字,第三个是数字个数,第四个是当前存入数组的数字
}
cout<<sum<<endl;
return 0;
}