मान लीजिए कि हमारे पास बिना कोष्ठक के एक अंकगणितीय व्यंजक है। हमारा कार्य उस अभिव्यक्ति के सभी संभावित परिणामों को खोजना है। मान लीजिए कि व्यंजक 1+2*3-4 जैसा है, इसकी व्याख्या नीचे की तरह की जा सकती है -
- 1+(2*(3-4)) =1 + (2* -1) =-1
- (1+2)*(3-4) =3 * -1 =-3
- 1+((2*3)-4) =1 + (6 - 4) =3
- ((1+2)*3)-4 =(3 * 3) - 4 =5
- 1+(2*3)-4 =1 + 6 - 4 =3
इस समस्या को हल करने के लिए, हमें इन चरणों का पालन करना होगा -
-
प्रारंभ में रेस को खाली के रूप में सेट करें
-
प्रत्येक ऑपरेटर x के लिए, निम्न कार्य करें -
-
x के बाईं ओर सभी संभावित मानों का पुनरावर्ती मूल्यांकन करें, मानों की सूची को L होने दें
-
x के दाईं ओर सभी संभावित मानों का पुनरावर्ती मूल्यांकन करें, मान लें कि मानों की सूची R
. है -
एल में सभी मानों के माध्यम से लूप करें:
-
R−
. में सभी मानों के माध्यम से लूप करें-
L और R में वर्तमान तत्व पर वर्तमान ऑपरेटर x लागू करें, और मूल्यांकन किए गए मानों को res में जोड़ें
-
-
-
- रेस को आउटपुट के रूप में लौटाएं
उदाहरण
#include<iostream>
#include<vector>
using namespace std;
int solve(int a, char op, int b) {
if (op=='+')
return a+b;
if (op=='-')
return a-b;
if (op == '*')
return a*b;
}
vector<int> getAllResults(string expr, int low, int high) {
vector<int> res;
if (low == high) {
res.push_back(expr[low] - '0');
return res;
}
if (low == (high-2)) {
int num = solve(expr[low]-'0', expr[low+1], expr[low+2]-'0');
res.push_back(num);
return res;
}
for (int i=low+1; i<=high; i+=2) {
vector<int> L = evaluateAll(expr, low, i-1);
vector R = evaluateAll(expr, i+1, high);
for (int s1=0; s1<L.size(); s1++) {
for (int s2=0; s2<R.size(); s2++) {
int val = solve(L[s1], expr[i], R[s2]);
res.push_back(val);
}
}
}
return res;
}
int main() {
string expr = "1+2*3-4";
vector<int> ans = getAllResults(expr, 0, expr.length()-1);
for (int i=0; i< ans.size(); i++)
cout << ans[i] << endl;
} आउटपुट
2 1 4 3 5 6 7 8