法一:
:最暴力:全排列法(1分钟左右出结果,不过做填空只要一个结果就可以了)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13};
int ans=0;
bool check()
{
if(a[0]+a[1]!=a[2])
{
return 0;
}
if(a[3]-a[4]!=a[5])
{
return 0;
}
if(a[6]*a[7]!=a[8])
{
return 0;
}
if(a[9]!=a[10]*a[11])
{
return 0;
}
return 1;
}
void f(int k)
{
if(k==13)
{
bool b=check();
if(b)
{
ans++;
}
}
for(int i=k;i<13;i++)
{
int t=a[i];
a[i]=a[k];
a[k]=t;
f(k+1);
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
int main()
{
ans=0;
f(0);
printf("%d\n",ans);
}
法二:剪枝+全排列
秒出结果
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13};
int ans=0;
bool check()
{
if(a[0]+a[1]!=a[2])
{
return 0;
}
if(a[3]-a[4]!=a[5])
{
return 0;
}
if(a[6]*a[7]!=a[8])
{
return 0;
}
if(a[9]!=a[10]*a[11])
{
return 0;
}
return 1;
}
void f(int k)
{
if(k==13)
{
bool b=check();
if(b)
{
ans++;
}
}
for(int i=k;i<13;i++)
{
int t=a[i];
a[i]=a[k];
a[k]=t;
if((k==2&&a[0]+a[1]!=a[2])||(k==5&&a[3]-a[4]!=a[5])||(k==8&&a[6]*a[7]!=a[8])||(k==11&&a[9]!=a[10]*a[11])) ///剪枝,提前排除,不给不符合条件的走check()的机会
{
int t=a[i]; ///回溯
a[i]=a[k];
a[k]=t;
continue;
}
f(k+1);
t=a[i]; //回溯
a[i]=a[k];
a[k]=t;
}
}
int main()
{
ans=0;
f(0);
printf("%d\n",ans);
}