A Za, A Za, Fighting...

坚信:勤能补拙

PKU 1950 Dessert

问题:
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[] = { 23456789101112131415 };
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 }

posted on 2010-07-25 10:06 simplyzhao 阅读(151) 评论(0)  编辑 收藏 引用 所属分类: B_搜索


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2010年7月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜