2016年蓝桥杯省赛填空题 1.寒假作业 知识点:全排列 ,剪枝

57 阅读1分钟

题目:1.寒假作业 - 蓝桥云课 (lanqiao.cn)

解析:2016-C-C题7寒假作业_哔哩哔哩_bilibili

我们需要把1~13个数字往这些空里填,实际上就是全排列。

13!是62*1e8,要跑很久 image.png

如果不剪枝跑了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;
}

image.png

我们可以这样剪枝,

image.png image.png

还想再快一点的话,我们把*法那里也剪枝一下:

image.png image.png