洛谷【p1149】火柴棒等式(完全遞迴)
阿新 • • 發佈:2019-01-25
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int num[11] = {6,2,5,5,4,5,6,3,7,6},n,ans = 0;
int find3(int x)
{
if(x == 0)
return 6;
int an = 0;
while(x)
{
an += num[x % 10];
x /= 10;
}
return an;
}
void find2(int cnt,int a,int x,int k)//第二位數;
{
if(find3(a + x) == cnt)
ans ++;
if(k)//避免首位數為0;
for(int i = 0;i <= 9;i ++)
{
if(cnt - num[i] >= 2)//至少還要放1個1;
find2(cnt - num[i],a,x * 10 + i,1);
}
}
void find(int cnt,int x,int k)//第一位數;
{
for(int i = 0;i <= 9;i ++)
if(n - num[i] >= 2)
find2(cnt - num[i],x,i,i);
if(k)//避免首位數為0;
for(int i = 0;i <= 9;i ++)
{
if(cnt - num[i] >= 4)
find(cnt - num[i],x * 10 + i,1);
}
}
int main()
{
scanf("%d",&n);
n -= 4 ;// ‘+’ 和 ‘=’;
for(int i = 0;i <= 9;i ++)
if(n - num[i] >= 4)//至少還要放2個1;
find(n - num[i],i,i);
printf("%d",ans);
}