#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
const int res = 2000;
int n;
string input, str, temp;
vector<string> ans;
//字典序优先级
char op[3] = { '*', '+', '-' };
int GetResult(int a, int b, int o) {
if (o == '+') return a + b;
else if (o == '-') return a - b;
return a * b;
}
void Check(string& t) {
stack<int> st;
stack<char> sign;
int before = 0, last = 0, isAdd = -1, o;
for (int i = 0; i < t.size(); i++) {
if (isdigit(t[i])) {
last = last * 10 + (t[i] - '0');
}
else {
if (!sign.empty() && sign.top() == '*') {
before = st.top(); st.pop();
o = sign.top(); sign.pop();
last = GetResult(before, last, o);
}
if (t[i] == '+' || t[i] == '-') {
while (!sign.empty()) {
before = st.top(); st.pop();
o = sign.top(); sign.pop();
last = GetResult(before, last, o);
}
}
st.push(last);
sign.push(t[i]);
last = 0;
}
}
while (!sign.empty()) {
before = st.top(); st.pop();
o = sign.top(); sign.pop();
last = GetResult(before, last, o);
}
if (last == res) {
ans.push_back(t);
}
}
void dfs(int pos, string& cur, string& t) {
if (pos >= n) {
if (t.empty()) return;
if (!cur.empty()) t += cur;
Check(t);
if (!cur.empty()) t.erase(t.size() - cur.size());
return;
}
char c = input[pos];
if (cur != "0") {
//拼接数字
cur.push_back(c);
dfs(pos + 1, cur, t);
cur.pop_back();
}
if (!cur.empty()) {
//数字拼接完成并添加运算符号
t += cur;
string tt(1, c);
for (int i = 0; i < 3; i++) {
t.push_back(op[i]);
dfs(pos + 1, tt, t);
t.pop_back();
}
t.erase(t.size() - cur.size());
}
}
int main()
{
int kcase = 0;
while (cin >> input && input != "=") {
temp.clear();
ans.clear();
str = "";
n = input.size() - 1;
dfs(0, str, temp);
cout << "Problem " << ++kcase << endl;
if (ans.empty()) cout << " IMPOSSIBLE" << endl;
else {
for (auto it = ans.begin(); it != ans.end(); it++)
{
cout << " " << *it << "=" << endl;
}
}
}
return 0;
}
习题7-13(uva-817)
最新推荐文章于 2021-07-01 11:56:40 发布