解析:2016-C-C题7寒假作业_哔哩哔哩_bilibili
我们需要把1~13个数字往这些空里填,实际上就是全排列。
13!是62*1e8,要跑很久
如果不剪枝跑了100多秒才跑出来:
#include <iostream>
using namespace std;
int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13};
int ans;
bool check()
{
if(a[0]+a[1]==a[2] &&
a[3]-a[4]==a[5] &&
a[6]*a[7]==a[8] &&
a[9]%a[10]==0&& //检查a[10]是否是0
a[9]/a[10]==a[11] //如果是,则 a[9] % a[10] 将会产生一个运行时错误。
)return true;
return false;
}
void f(int k)
{
if(k==13)
{
if(check())
{
ans++;
}
}
for(int i=k;i<13;i++)
{
{int t=a[k];a[k]=a[i];a[i]=t;}
f(k+1);
{int t=a[k];a[k]=a[i];a[i]=t;}
}
}
int main()
{
f(0);
cout<<ans;
return 0;
}
我们可以这样剪枝,
还想再快一点的话,我们把*法那里也剪枝一下: