[蓝桥杯] 结果填空:补全等式(dfs)

结果填空:补全等式

[蓝桥杯] 结果填空:补全等式(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;
}