地址:http://acm.hdu.edu.cn/showproblem.php?pid=4192
思路:首先将中缀表达式转为后缀表达式,然后将数组全排列取计算每一个排列的后缀表达式的值即可
Code:
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
int n;
int d[55];
stack<string> sta;
string transform(string s){
string ss="",si;
int len=s.size();
while(!sta.empty()){
sta.pop();
}
for(int i=0;i<len;)
{
si=s[i++];
if(si.size()==1&&(si=="+"||si=="-"||si=="*"||si=="/"||si=="("||si==")")){
if(si==")"){
if(sta.top()!="("){
ss=ss+sta.top(); sta.pop();
}
sta.pop();
}else{
if((si=="+"||si=="-")&&!sta.empty()&&(sta.top()=="+"||sta.top()=="-")){
ss=ss+sta.top(); sta.pop();
}
sta.push(si);
}
}else{
ss=ss+si;
if(!sta.empty()&&(sta.top()=="*"||sta.top()=="/")){
ss=ss+sta.top(); sta.pop();
}
}
}
if(!sta.empty()){
ss=ss+sta.top(); sta.pop();
}
return ss;
}
int calculate(string s){
int t=0,a,b;
stack<int> stai;
for(int i=0;i<s.size();++i)
{
if(s[i]>='a'&&s[i]<='z'){
stai.push(d[t++]);
}else{
b=stai.top(); stai.pop();
a=stai.top(); stai.pop();
if(s[i]=='+') a+=b;
else if(s[i]=='-') a-=b;
else if(s[i]=='*') a*=b;
else a/=b;
stai.push(a);
}
}
return stai.top();
}
int main()
{
int ans;
string s,ss;
while(cin>>n&&n){
for(int i=0,x;i<n;++i)
{
cin>>x;
d[i]=x;
}
cin>>ans>>s;
ss=transform(s);
int m=1;
for(int i=1;i<=n;++i)
m*=i;
string res="NO";
while(m--){
if(calculate(ss)==ans){
res="YES"; break;
}
next_permutation(d,d+n);
}
cout<<res<<endl;
}
return 0;
}