火柴棒等式(dfs+暴力枚举)

火柴棒等式
思路:dfs暴力枚举,搜索,具体的看注释叭
ps:n<=24,有4根用于加号,等号,则20根用来拼数字,最大就是11111啦,相当于放缩(来自ch大佬的想法)
ps:思路来自(zyw学长)

#include<iostream>   //2021.4.1暴力枚举,搜索 
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
long long int ans;
int n;
int num[10]={6,2,5,5,4,5,6,3,7,6};//代表数字i所需火柴根数 
int ar[3];//a[0]+a[1]=a[2] 
void dfs(int cur)//cur代表搜索层数
{
	if(cur==3)//一层一个数,到了第三层就凑齐三个数了
	{
		int a,b,c,sum=0;
		if(ar[0]+ar[1]!=ar[2])//不满足,return,进行下一次遍历 
		return;
		for(int i=0;i<3;++i)//否则分别计算a[0],a[1],a[2]所表示的火柴数,sum计算总和 
		{
			if(ar[i]>=100)//考虑三位数以上的情况 
			{
				a=ar[i]/100;
				sum+=num[a];
				b=(ar[i]%100)/10;
				sum+=num[b];
				c=ar[i]%10;
				sum+=num[c];
			}
			else if(ar[i]>=10)//两位数 
			{
				a=ar[i]/10;
				b=ar[i]%10;
				sum+=num[a];
				sum+=num[b];
			}
			else//个位数 
			sum+=num[ar[i]]; 
		}
		if(sum==n)//火柴用完ans+1 
			++ans;		
		return;
	}
	//在0-199中选一个数作为ar[cur],选了之后进入下一层,每个数都在0-199中遍历过一次,一共200的三次方 
	for(int i=0;i<=199;++i)//每层选一个数,然后进入下一层 
	{
		ar[cur]=i; 
		dfs(cur+1); 
	}
}
int main(void)
{
	cin>>n;
	n-=4;
	dfs(0);//从0开始 
	cout<<ans;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值