1 条题解
-
0
采用DFS搜索解决。由于数字的位置是固定的,所以在符号的位置上不断地尝试三种符号即可,若最终的表达式结果为0且是前20个表达式,则输出该表达式。当处理完所有数字(num = n)时,检查最终表达式的值是否为零。若为零且组合数不超过 20,输出该表达式。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #include <stack> #include <queue> #include <map> #include <string> #include <vector> #include <cmath> using namespace std ; const int MX = 100 + 5 ; const int INF = 0x3f3f3f3f ; int n ,ans ; char s[MX] ; void dfs(int num ,int sum ,int temp ,int pre ,int di) // sum 已经计算的总和 { if(n == num) { if(s[num-1] != '.') sum += temp*pre ; else // 大于等于 10 的时候特殊 { if(num < 10) sum += (temp*10 + num)*pre ; else sum += (temp*100 + num)*pre ; } if(sum) return ; ans++ ; if(ans > 20) return ; cout<<1 ; for(int i = 2 ;i <= n ; ++i) cout<<" "<<s[i-1]<<" "<<i ; cout<<endl ; return ; } int Temp = temp ; if(s[num-1] == '.') { if(num < 10) Temp = temp*10 + num ; else Temp = temp*100 + num ; } s[num] = '+' ; // + dfs(num+1 ,sum + Temp*pre ,num+1 ,1 ,0) ; s[num] = '-' ; // - dfs(num+1 ,sum + Temp*pre ,num+1 ,-1 ,0) ; s[num] = '.' ; // . if(!di) // 第一次放点 dfs(num+1 ,sum ,num ,pre ,di+1) ; else { if(num < 10) // 注意 >= 10 是需要乘 100 dfs(num+1 ,sum , temp*10 + num ,pre ,di+1) ; else dfs(num+1 ,sum ,temp*100 + num ,pre ,di+1) ; } } int main() { while(~scanf("%d" ,&n)) { ans = 0 ; s[0] = '+' ; // dfs(1 ,0 ,1 ,1 ,0) ; //主要是点的情况特殊 cout<<ans<<endl ; } return 0 ; }
- 1
信息
- ID
- 951
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者