USACO Section 2.3: Zero Sum

这题我做得比较麻烦,网上有个比较简单的程序。

 1 /*

 2 ID: yingzho1

 3 LANG: C++

 4 TASK: zerosum

 5 */

 6 #include <iostream>

 7 #include <fstream>

 8 #include <string>

 9 #include <map>

10 #include <vector>

11 #include <set>

12 #include <algorithm>

13 #include <stdio.h>

14 #include <queue>

15 #include <cstring>

16 #include <cmath>

17 

18 using namespace std;

19 

20 ifstream fin("zerosum.in");

21 ofstream fout("zerosum.out");

22 

23 int N;

24 set<string> res;

25 

26 string intToString(int n) {

27     string ret;

28     if (n == 0) return "0";

29     while (n) {

30         char tmp = char('0' + n%10);

31         ret += tmp;

32         n /= 10;

33     }

34     reverse(ret.begin(), ret.end());

35     string res;

36     res += ret[0];

37     for (int i = 1; i < ret.size(); i++) res = res + ' ' + ret[i];

38     return res;

39 }

40 

41 bool check(vector<int> &num, vector<char> &op) {

42     if (num.size() <= 1) return false;

43     int sum = num[0];

44     for (int i = 1; i < num.size(); i++) {

45         if (op[i-1] == '+') sum += num[i];

46         else sum -= num[i];

47     }

48     return sum == 0;

49 }

50 

51 void dfs(int dep, vector<int> &num, vector<char> &op, int sum) {

52     if (dep > N) {

53         /*for (int i = 0; i < num.size(); i++) cout << num[i] << " ";

54         cout << endl;

55         for (int i = 0; i < op.size(); i++) cout << op[i] << " ";

56         cout << endl;*/

57         if (sum) num.push_back(sum);

58         if (check(num, op)) {

59             string tmp;

60             for (int i = 0; i < num.size()-1; i++) {

61                 tmp = tmp + intToString(num[i]) + op[i];

62             }

63             tmp = tmp + intToString(num[num.size()-1]);

64             res.insert(tmp);

65         }

66         if (sum) num.pop_back();

67         return;

68     }

69     sum = sum*10 + dep;

70     dfs(dep+1, num, op, sum);

71     num.push_back(sum);

72     op.push_back('+');

73     dfs(dep+1, num, op, 0);

74     op.pop_back();

75     op.push_back('-');

76     dfs(dep+1, num, op, 0);

77     op.pop_back();

78     num.pop_back();

79 }

80 

81 int main()

82 {

83     fin >> N;

84     vector<int> num;

85     vector<char> op;

86     dfs(1, num, op, 0);

87     for (set<string>::iterator it = res.begin(); it != res.end(); it++) {

88         fout << *it << endl;

89     }

90 

91     return 0;

92 }

 

你可能感兴趣的:(USACO)