题目描述
给你 �n 根火柴棍,你可以拼出多少个形如 �+�=�A+B=C 的等式?等式中的 �A、�B、�C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 00)。用火柴棍拼数字 0∼90∼9 的拼法如图所示:
注意:
- 加号与等号各自需要两根火柴棍;
- 如果 �≠�A=B,则 �+�=�A+B=C 与 �+�=�B+A=C 视为不同的等式(�,�,�≥0A,B,C≥0);
- �n 根火柴棍必须全部用上。
输入格式
一个整数 �(1≤�≤24)n(1≤n≤24)。
输出格式
一个整数,能拼成的不同等式的数目。
输入输出样例
输入 #1复制
14
输出 #1复制
2
输入 #2复制
18
输出 #2复制
9
说明/提示
【输入输出样例 1 解释】
22 个等式为 0+1=10+1=1 和 1+0=11+0=1。
【输入输出样例 2 解释】
99 个等式为
0+4=40+4=4、0+11=110+11=11、1+10=111+10=11、2+2=42+2=4、2+7=92+7=9、4+0=44+0=4、7+2=97+2=9、10+1=1110+1=11、11+0=1111+0=11。
noip2008 提高第二题
题解
因为这题给的火柴的数量其实不多,我们可以尝试去枚举每一种情况。
最多24根火柴,其中4根用来构建等于和加号,20根火柴能构成的最大树我们先猜1000,如果不够再往大了猜,以免超时(这个最大应该是711),然后我们把3个位置的情况用dfs全部搜出来,1,2位置为0,0,的一条路走到黑,有符合的就数量加1。
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<vector>
#include<math.h>
#include<iomanip>
#include<set>
#include<queue>
#include<stack>
#include<map>
#include<list>
#include <stdlib.h>
#include<deque>
using namespace std;
int n, a[10000], b[10] = {6,2,5,5,4,5,6,3,7,6},ans,ch;
int fun(int x)//计算每个数要多少火柴摆出来
{int n=0;if (x == 0){return 6;}while (x > 0){n = n + b[x % 10];x = x / 10;}return n;
}
void dfs(int x)
{if (x > 3){if (a[1] + a[2] == a[3]){if (fun(a[1]) + fun(a[2]) + fun(a[3]) == n){if (a[1] == a[2]){ch++;}ans = ans + 1;}}return;}for (int i = 0; i < 712; i++){a[x] = i;dfs(x + 1);a[x] = a[x] - i;//还原上一步}
}
int main()
{cin >> n;n = n - 4;dfs(1);cout << ans-ch/2;
}