noip2008提高组——火柴棒等式


这道题算法上  就是裸dfs 吧

主要是看代码能力。。(这是一个悲伤的故事。。QAQ) 


细节上只要注意0不可以开头就好了

有一个小优化
把加号和等号一起看做分隔符号

就只用数分割号的个数   模拟起来就好做多了


#include<cstdio>
#include<cstring>
using namespace std;
const int use[]={6,2,5,5,4,5,6,3,7,6,2};
int n,ans;
char cal[100];
bool getnum(int len,int &now,int &i,int jh)
{
int bz=0;
while(1)
{
if(cal[i]>'9')
break;
if(i==len+1)
{
bz=1;break;
}
if(now==-1)
{
now=cal[i]-'0';
i++;
continue;
}
now*=10;
now+=cal[i]-'1'+1;
i++;
}
if(jh==1)
bz=0;
if(now==-1||bz==1)
return false;
i++;
return true;
}
void work()
{
int now=-1,now1=-1,res=-1;
int len=strlen(cal)-1;
int cnt=0;
for(int i=0;i<=len;i++)
if(cal[i]>'9')
cnt++;
if(cnt>2)
return;
int i=0;
int bz=0;
if(!getnum(len,now,i,0))
return;
if(!getnum(len,now1,i,0))
return;
if(!getnum(len,res,i,1))
return;
if(res==now+now1)
ans++;
}
void solve(int depth,int now)
{
if(depth>n)
return;
if(depth==n)
{
work();
return;
}
for(int i=0;i<=10;i++)
{
if(cal[now-1]=='0'&&i==0)
continue;
if(cal[now-1]=='0'&&i!=10)
continue;
cal[now]=i+'1'-1;
solve(depth+use[i],now+1);
cal[now]=0;
}
}
int main()
{
scanf("%d",&n);
solve(0,0);
printf("%d",ans);
}


智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告