当前位置: 代码迷 >> 综合 >> 火柴棒等式(洛谷 1149 NOIp2008 提高组 T2 )
  详细解决方案

火柴棒等式(洛谷 1149 NOIp2008 提高组 T2 )

热度:84   发布时间:2023-12-08 13:18:58.0
火柴棒等式(洛谷 1149 && NOIp2008 提高组 T2
题目描述
给你
n 根火柴棍, 你可以拼出多少个形如 “A+B=C” 的等式? 等式中的 A B C
是用火柴棍拼出的整数( 若该数非零, 则最高位不能是 0 ) 。
注意:
加号与等号各自需要两根火柴棍
如果
A≠B , 则 A+B=C B+A=C 视为不同的等式( A B C>=0
n 根火柴棍必须全部用上
输入输出格式
输入格式:
输入文件
matches.in 共一行, 又一个整数 n n<=24 ) 。
输出格式:
输出文件
matches.out 共一行, 表示能拼成的不同等式的数目。
输入输出样例
输入样例
#1
样例输入
1
14
样例输入 2
18
分析:
直接暴力枚举每个数, 就是正解。 ( 注意处理火柴的数量)
火柴棒等式 .cpp
码很简单:
——————————————
基于 dfs 框架的枚举
既然也是枚举, 那么大体思路也是一样的。 对于某些问题, 有 n 个需要确定
的内容。 通常, 我们就可以用
n 层循环语句进行逐一枚举, 再判断每种情况能否
符合条件, 最后得出答案。 但是, 这里不同的是, 你不能确定到底有多少层循环,
或者, 循环的层数是由输入来决定的, 或者循环的层数太多了, 代码写不下。
这时我们可以使用
dfs ( 深度优先搜索) 的框架来解决问题。
给出伪代码
void dfs ( int x, int step ) {
if ( step == n ) return ; //
如果已经有 n
for ( i = 1; i <= 当前层所有可能的情况 ; i ++ {
Do_what_you_want_here() ; //
决定当前
dfs ( u, step+1 ) ; // 层数 +1
Back() ; //
回溯
}
}

附AC码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int a[10]={6,2,5,5,4,5,6,3,7,6};
int gs(int x){int ans=0;if(x==0)return 6;while(x>0){ans+=a[x%10];x/=10;}return ans; 
}
int main(){int i,j,k,n,hehe=0;scanf("%d",&n);n-=4; for(i=0;i<=999;i++)for(j=0;j<=999;j++)if(gs(i)+gs(j)+gs(i+j)==n)hehe++;printf("%d\n",hehe);return 0;
}