首页 > 技术文章 > noip200806火柴棒等式

dijkstra2003 2017-07-14 12:57 原文

试题描述: 

   给你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)。

输出:

共一行,表示能拼成的不同等式的数目。

输入示例:

【输入样例1】14
【输入样例2】18

输出示例:

【输出样例1】2
【输出样例2】9

解题思路:

先打一个表,然后就是模拟。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
int n;
int main()
{
    int need[10010];
    memset(need,250,sizeof(need));
    need[0]=6;
    need[1]=2;
    need[2]=5;
    need[3]=5;
    need[4]=4;
    need[5]=5;
    need[6]=6;
    need[7]=3;
    need[8]=7;
    need[9]=6;
    cin>>n;
    for(int i=10;i<=999;i++)
    {
        char c[4];
        sprintf(c,"%d",i);
        int l=strlen(c);
        //cout<<l<<" ";
        need[i]=0;
        for(int j=0;j<l;j++)
        {
            int a=c[j]-'0';
            need[i]+=need[a];
        }
    }
    n=n-4;
    int ans=0;
    for(int i=0;i<999;i++)
        for(int j=0;j<999;j++)
        {
            int k=i+j;
            if(need[i]+need[j]+need[k]==n)
            {
                ans++;
                //cout<<i<<"+"<<j<<"="<<k<<endl;
            }
        }
    cout<<ans;
    //system("pause");
}
/*111+111=222*/
View Code

 

推荐阅读