问题:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1950思路:
首先想到的方法是枚举所有的可能,然后依次计算每个表达式的值,看看是否等于零
想法简单,然而碰到的问题是如何计算表达式?汗...还真不会,是不是得用堆栈的呵呵
看了网上的代码,原来还可以一边深度搜索一边计算表达式值的,技巧在于如何处理"."这个"运算符"
depth: 搜索深度,即运算符的个数
cur: 目前表达式的值
pre: 前一个运算数
代码:
1 #define MAX_N 16
2 #define MAX_SOLVE 20
3 int total;
4 int n;
5 const int arr[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
6 const char op[] = {'+', '-', '.'};
7 char oparr[MAX_N];
1 void
2 solve(int depth, int cur, int pre)
3 {
4 if(depth+1 == n) {
5 cur += pre;
6 if(cur == 0) {
7 ++total;
8 if(total <= MAX_SOLVE)
9 output();
10 }
11 return;
12 }
13 oparr[depth] = op[0];
14 solve(depth+1, cur+pre, arr[depth]);
15 oparr[depth] = op[1];
16 solve(depth+1, cur+pre, -arr[depth]);
17 oparr[depth] = op[2];
18 if(arr[depth]>=10)
19 pre = pre*100 + pre/abs(pre)*arr[depth];
20 else
21 pre = pre*10 + pre/abs(pre)*arr[depth];
22 solve(depth+1, cur, pre);
23 }