[POJ1950]Dessert(DFS)

题目链接:http://poj.org/problem?id=1950

题意:n个数字中间添加若干个+或-,使得式子运算结果为0。

枚举位置以及符号即可,注意有可能出现10 11之类的数字,比如这两个数字组合起来会是1011。所以要特别考虑两位数时的组合,即原数*100再加新的数。

还要默认0 1之间是+,否则会多解。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <cassert>
 8 #include <cstdio>
 9 #include <bitset>
10 #include <vector>
11 #include <deque>
12 #include <queue>
13 #include <stack>
14 #include <ctime>
15 #include <set>
16 #include <map>
17 #include <cmath>
18 using namespace std;
19 
20 const int maxn = 16;
21 int n, tot;
22 int m;
23 char tmp[maxn*5];
24 char opt[maxn*5];
25 
26 void dfs(int pos, int pre, int sum) {
27     if(pos == n) {
28         if(sum != 0) return;
29         if(tot < 20) {
30             for(int i = 1; i < n; i++) printf("%d %c ", i, opt[i]);
31             printf("%d\n", n);
32         }
33         tot++;
34         return;
35     }
36     opt[pos] = '+'; dfs(pos+1, pos+1, sum+pos+1);
37     opt[pos] = '-'; dfs(pos+1, pos+1, sum-pos-1);
38     opt[pos] = '.';
39     int cur = pos - 1;
40     while(opt[cur] == '.' && cur >= 0) cur--;
41     if(pos < 9) {
42         if(opt[cur] == '+') dfs(pos+1, pre*10+pos+1, sum+(pre*10+pos+1-pre));
43         else dfs(pos+1, pre*10+pos+1, sum-(pre*10+pos+1-pre));
44     }
45     else {
46         if(opt[cur] == '+') dfs(pos+1, pre*100+pos+1, sum+(pre*100+pos+1-pre));
47         else dfs(pos+1, pre*100+pos+1, sum-(pre*100+pos+1-pre));
48     }
49 }
50 
51 int main() {
52     // freopen("in", "r", stdin);
53     while(~scanf("%d", &n)) {
54         tot = 0; m = 0;
55         memset(tmp, 0, sizeof(tmp));
56         memset(opt, 0, sizeof(opt));
57         opt[0] = '+';
58         dfs(1, 1, 1);
59         cout << tot << endl;
60     }
61     return 0;
62 }

posted @ 2017-02-24 12:05  Kirai  阅读(130)  评论(0编辑  收藏  举报