PTA 计算结果为0的数列

计算结果为0的数列

分数 15

作者 李佳

单位 重庆大学

递增数列:1 2 3 ⋯ N, 在相邻数字之间插入符号+,−或空格。其中,‘+’表示加,‘-’表示减,空格' '表示组合成多位整数,比如‘‘2+3  4+5  6−7" 表示 ‘‘2+34+56−7"。找出所有计算结果为零的长度为N 的数列。

输入格式:

单独的一行表示整数N (3≤N≤9)。

输出格式:

按照 ASCII 码的顺序,输出所有在每对数字间插入'+', '-', 或 ' ' 后能得到计算结果为零的数列。

输入样例:

7

输出样例:

1+2-3+4-5-6+7
1+2-3-4+5+6-7
1-2 3+4+5+6+7
1-2 3-4 5+6 7
1-2+3+4-5+6-7
1-2-3-4-5+6+7
#include 
#include 
#include 
using namespace std;

void backtrack(int n, int index, string current, vector& results);

int main() {
    int N;
    cin >> N;
    vector results;
    // 从数字1开始,初始current是"1"
    backtrack(N, 2, "1", results);  // 下一个数字是2
    for (const string& s : results) {
        cout << s << endl;
    }
    return 0;
}

void backtrack(int n, int index, string current, vector& results) {
    if (index > n) {
        // 计算当前表达式的值
        int sum = 0;
        int num = 0;
        char op = '+';
        for (int i = 0; i < current.size(); ++i) {
            if (current[i] == ' ') {
                continue;  // 空格用于连接数字,不处理
            }
            if (isdigit(current[i])) {
                num = num * 10 + (current[i] - '0');
            }
            if (!isdigit(current[i]) || i == current.size() - 1) {
                if (op == '+') {
                    sum += num;
                } else if (op == '-') {
                    sum -= num;
                }
                if (i != current.size() - 1) {
                    op = current[i];
                }
                num = 0;
            }
        }
        if (sum == 0) {
            results.push_back(current);
        }
        return;
    }
    
    // 当前数字
    char c = '0' + index;
 // 尝试三种操作,注意顺序:'+', ' ', '-'
    backtrack(n, index + 1, current + ' ' + c, results);
    backtrack(n, index + 1, current + '+' + c, results);
    backtrack(n, index + 1, current + '-' + c, results);
}

 

你可能感兴趣的:(算法)