蓝桥杯.寒假作业(DFS回溯+剪枝)

Question:

Result: 64

Solve:

DFS回溯,就一个一个去试能填几,然后就TLE了

两个问题:

第一:完全跑13个数去试,会炸,需要提前把不可能成立的方案去掉,比如填完第一行了,我就去看看第一个式子能否成立

第二:这个题的标答里除法是只算整除的,而不是“/”,然后就导致我看着我的1376发呆了半天,大无语事件

Code:

#include <bits/stdc++.h>
using namespace std;
bool a[14];
int num[13];
int res = 0;
void dfs(int deep)
{
	//提前去除 
	if(deep > 3 && num[1] + num[2] != num[3])return ;
	if(deep > 6 && num[4] - num[5] != num[6])return ;
	if(deep > 9 && num[7] * num[8] != num[9])return ;
	//终判 
	if(deep > 12)
	{
		if(num[10] / num[11] == num[12] && num[10]%num[11] == 0)
			res++;
			
		return ;
	}
	//搜索 
	for(int i = 1; i <= 13; i++){
		if(a[i] == true) continue;
		num[deep] = i; a[i] = true;
		dfs(deep+1);
		//回溯 
		a[i] = false;
	}
}
int main(void)
{
	memset(a,false,sizeof(a));
	dfs(1);
	cout <<res;
	return 0;
}

声明:图片均来源于蓝桥杯官网,以个人刷题整理为目的,如若侵权,请联系删除~

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UmVfX1BvaW50

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值