转载自:http://www.luishen.com/post/2012-11-24/Match_Equation.php
因为感觉很经典外加最近很忙的样子,所以现先转载过来了,等有时间再验证起正确性。
matches
时间限制:1秒 内存限制: 128 MB
试题描述
给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:
注意:
1. 加号与等号各自需要两根火柴棍
2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
3. n根火柴棍必须全部用上
输入要求
共一行,又一个整数n(n<=24)。
输出要求
共一行,表示能拼成的不同等式的数目。
输入样例
14
输出样例
2
知识点及提示
2个等式为0+1=1和1+0=1。
等号与加号要4根。
然后一个加数至少要2根。还有18根。
由于是加数要少于和所以另一个加数至少要8根。最大为1111
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int need[16]={6,2,5,5,4,5,6,3,7,6};
int num[1500];
void
preorder( ){
for(int i=0; i<=1200; i++) {
char str[8];
sprintf(str,"%d",i);
for(int j=0; str[j]; j++) {
num[i] += need[ (str[j]-'0') ];
}
}
}
int main(){
preorder();
int n;
while( scanf("%d",&n)!=EOF ) {
int ans=0;
if(n<=8) {
printf("%d\n",ans); continue;
}
n-=4;
int x,y,z;
for(x=0; x<=1111; x++) {
y=x;
z=x+y;
if(z>1111) break;
if(num[x]+num[y]+num[z]==n) ++ans;
}
for(x=0; x<=1111; x++) {
for(y=x+1; y<=1111; y++) {
z=x+y;
if(z>1111) break;
if(num[x]+num[y]+num[z]==n) {
ans+=2;
//printf("%d %d\n",x,y);
}
}
}
printf("%d\n",ans);
}
return 0;
}