应用算法:dfs,剪枝(提前终止搜索),自写全排列
注意:在函数中可以将终止条件先写在if里,else里写正常执行的条件
题目思路:将1-13全排列,在填入到题目中,看有几种全排列满足,ans就是几。
注意除法的问题:c语言中,1/2等于0,所以除法必须化为小数才能除,否则准确性很低。
本题中答案为64,1376是错误的。
#include<bits/stdc++.h>
using namespace std;
int a[20]={1,2,3,4,5,6,7,8,9,10,11,12,13};
bool vis[20];
int b[20];
int ans=0;
void dfs(int s,int t)//从第s个开始,到第t个结束,一般从0开始,s=几,说明排好了几个。
{
if(s==12) {
if(b[9]*b[10] == b[11])
ans++;
return;
}
if(s==3 && b[0]+b[1]!=b[2]) return; //剪枝,如果不符合题目条件,终止。
if(s==6 && b[3]-b[4]!=b[5]) return;
if(s==9 && b[6]*b[7]!=b[8]) return;
for(int i=0;i<t;i++)
if(!vis[i])
{
vis[i]=true;
b[s]=a[i];
dfs(s+1,t);
vis[i]=false;
}
}
int main()
{
int n=13;
dfs(0,n);
cout << ans << endl;
return 0;
}