您的位置:首页 > 其它

|洛谷|搜索|NOIP2008|P1149 火柴棒等式

2016-12-10 23:07 211 查看
https://www.luogu.org/problem/show?pid=1149

/*https://www.luogu.org/problem/show?pid=1149
(NOIP提高组2008), 搜索
思路:先打表记录每个数字要的火柴棒根数,然后开始dfs
注意:“+”“=”算4个火柴棍
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define ms(i,j) memset(i,j, sizeof i);
using namespace std;
const int sz[10] = {6,2,5,5,4,5,6,3,7,6};
int n;
int ans = 0;
bool vi[20005];//是否相同
void dfs(int now, int s, int first, int last)
{
if (now==3)
{
if (first==last){if (vi[first]) return ; else vi[first] = true;}
int res = first + last;
int tot = 0;
do
{
tot += sz[res%10];
res /= 10;
}while (res!=0);
if (tot==s)
ans++;
return ;
} else
{
for (int i=0;i<=9;i++)
{
if (s-sz[i]>=0)
{
if (now==1)
{
if (!(i==0&&first==0)||(i!=0)||(first!=0)) dfs(now,s-sz[i],first*10+i,last);//第一个加数不为0
if (i!=0) if (first==0) dfs(now+1,s-sz[i]-sz[0],first,i); else dfs(now+1,s-sz[i],first,i);//第二个加数不为0
if (i==0) if (first==0) dfs(now+2,s-sz[i]-sz[0],first,i); else dfs(now+2,s-sz[i],first,i);//第二个加数为0
} else
{
dfs(now,s-sz[i],first,last*10+i);
}
}
}
if (now==2)
{
dfs(now+1,s,first,last);
}
}
}
int main()
{
scanf("%d", &n); n-=4;
ms(vi, false);
dfs(1,n,0,0);
printf("%d\n", ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: