usaco: Zero Sum

来源:互联网 发布:数据库第六版pdf网盘 编辑:程序博客网 时间:2024/06/09 22:24

直接枚举搜索就可以了。感觉usaco上的难度安排有很多不合理的地方,有些题很简单,有些题又很难。

以后做这种题得细心了,虽然一次过了,但改了很久。

/*ID: LANG: C++TASK: zerosum*/#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <vector>#define IN "zerosum.in"#define OUT "zerosum.out"using namespace std;const char ch[3] = {' ', '+', '-'};int N;vector<char> res;char t;void solve(int num, int data, int sum){   //num: 当前位数, data: 当前数字, sum: 当前和    res.push_back(char(num + '0'));    if(num == N) {        if(sum == 0) {            for(vector<char>::iterator it = res.begin(); it != res.end(); it++)                cout << *it;            cout << endl;            }        res.pop_back();        return ;    }        for(int i = 0; i < 3; i++) {        res.push_back(ch[i]);        int tmp_sum;        int tmp_data;        if(ch[i] == ' ') {            tmp_sum = t == '-' ? (sum + data - (data * 10 + num + 1)) : (sum - data + data * 10 + num + 1);            tmp_data = data * 10 + num + 1;        }        else {            tmp_data = num + 1;            if(ch[i] == '+') {                t = '+';                tmp_sum = sum + num + 1;            }            else {                t = '-';                tmp_sum = sum - (num + 1);            }        }        solve(num + 1, tmp_data, tmp_sum);        res.pop_back();    }    res.pop_back();}int main(){    freopen(IN, "rb", stdin);    freopen(OUT, "wb", stdout);        while(scanf("%d", &N) != EOF) {            t = '0';        res.clear();        solve(1, 1, 1);    }        return 0;}    

原创粉丝点击