|洛谷|搜索|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;
}
/*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;
}
相关文章推荐
- [NOIP2008] 提高组 洛谷P1149 火柴棒等式
- 洛谷 P1149 火柴棒等式2008 NOIp提高组
- 【搜索】洛谷 P1149 火柴棒等式
- 洛谷 P1149 火柴棒等式
- 洛谷-火柴棒等式-NOIP2008提高组复赛
- 火柴棒等式(洛谷 1149 && NOIp2008 提高组 T2 )
- [NOIP2008]火柴棒等式
- [NOIP2008] 火柴棒等式
- 传纸条 NOIP2008 洛谷1006 二维dp
- 【NOIP2008】T2 火柴棒等式 题解
- 【枚举】[NOIP2008]火柴棒等式
- 题目:[NOIP2008]火柴棒等式
- 【枚举】[NOIP2008]火柴棒等式
- |洛谷|搜索|NOIP2014|P2296 寻找道路
- NOIP2008 火柴棒等式
- 传纸条 NOIP2008 洛谷1006 二维dp
- 2008NOIP 火柴棒等式淫荡结题报告
- NOIP2008 笨小猴 火柴棒等式 传纸条 双栈排序
- 洛谷 P1149 火柴棒等式(模拟)
- 传纸条 NOIP2008 洛谷1006 二维dp