[蓝桥杯] 结果填空:补全等式(dfs)
结果填空:补全等式
解题思路
表示全排列没跑出来,实在太大
DFS+枚举跑了好几遍才出来
完整代码
#include <iostream>
using namespace std;
bool flag[13];//标记数组
int nn[13];//计算数组
int ans=0;
int dfs(int n)
{
if(n==6)
{
if(nn[0]*nn[1] + nn[2]*nn[3] != nn[4]*nn[5]) //计算式一是否成立,成立继续深度+1
return 0; · //不成立,退回选择下一个
}
else if(n==12) //来到这里的式一一定成立
{
if(nn[6]*nn[7] - nn[8]*nn[9] == nn[10]*nn[11]) //式二成立,
ans++;
return 0;
}
for(int i=0;i<13;i++)
{
if(flag[i]==false) //标记数组中没有用过
{
nn[n]=i+1; //枚举赋值
flag[i]=true; //标记已用
dfs(n+1); //将标记的数判断,成功的话最后++,
flag[i]=false; //不合适,清楚标记,深度下一个 //合适,清楚标记,回溯下一个
}
}
return 0;
}
int main()
{
dfs(0);
//注意,它的本意还是在遍历,是否合适,加标记。
//开始和结束都是一样的,不管怎么样都要回溯,深度下一个
cout<<ans;
}