穷举法--火柴棍等式问题

来源:互联网 发布:淘宝网卖家中心官网 编辑:程序博客网 时间:2024/06/03 05:22
题目描述给你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根火柴棍必须全部用上

分析:
   要找出形A+B=C的等式,最简单的办法就是分别枚举A、B、C,
然后确定A、B、C的枚举范围,经分析范围为0-1111,因为题目
中最多只有24根火柴,除去“+”“=”占用的4根火柴,最多剩下20根
火柴。20根火柴最多能组成10个1,因此A、B、C任意一个数不能
超为1111。
   是否需要三重循环呢?可以简化成两重循环,降低时间复杂度,
提高算法效率。通过枚举A,B,求出C,算法得以优化

代码:
  

#include<iostream>  

#include<string>  

#include<cstdio>

using namespace std;  

int fun(int x)

{

int num=0;//用来计数的变量,一定要初始化

int f[10]={6,2,5,5,4,5,6,3,7,6};//用一维数组来记录0-9每个数安需要用多少根火柴棍

while(x/10!=0)//如果x/10的商不等于0,说明这个数至少有两位

{//获得X的末尾数它将将此数所需要用到的火柴棍根数累加到num中

num+=f[x%10]; 

x=x/10;

} 

//最后加上此时x所需用到的火柴棍的根数(此时x一定是一位数)

num+=f[x] ;

return num;//返回需要火柴根的总根数

}

 

int main()

{int a,b,c,m,sum=0;

cin>>m;//读入火柴棍的个数

//开始枚举a和b

for(a=0;a<=1111;a++)

{for(b=0;b<=1111;b++)

{c=a+b;

if(fun(a)+fun(b)+fun(c)==m-4)

{printf("%d+%d=%d\n",a,b,c);//格式化输出

sum++;  //记录总方案数

}

}

} 

cout<<"一共可以拼出的方案数为:"<<sum<<endl;

return 0; 

}

原创粉丝点击