http://acm.hdu.edu.cn/showproblem.php?pid=4192
题目大意:给你n个数及一个答案,是否通过一个表达式计算出给出的那个答案。
解题思路:n很小,直接枚举,逆波兰中序转后序计算比较即可。
代码:套的第一次ACM作业的板板,写的啥我自己都看不懂。
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stack>
#define MAXN 1010
#define INF 0x7fffffff
#define eps 1e-10
#define MAX(x,y) ((x)>(y)? (x):(y))
#define MIN(x,y) ((x)<(y)? (x):(y))
#define MEM(a) (memset((a),0,sizeof(a)))
#define FRE freopen("input.txt","r",stdin)
using namespace std;
char s[MAXN],rs[MAXN]={0};
int num[10],path[10],cnt,al[26];
stack<char>oper;
stack<int>solve;
int op(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='('||c==')') return 1;
else return 0;
}
int vary(char c)//给每个字母赋予一个特定值
{
if(c>='a'&&c<='z')
{
if(al[c-'a']!=-1) return num[path[al[c-'a']]];
else { al[c-'a']=cnt++; return num[path[al[c-'a']]]; }
}
else return c-48;
}
int rank(char c)//符号的优先级
{
if(c=='+'||c=='-') return 0;
else if(c=='*') return 1;
else return -1;
}
int main()
{
int n;
while(scanf("%d",&n) && n)
{
while(!oper.empty()) oper.pop();
while(!solve.empty()) solve.pop();
memset(num,0,sizeof(num));
memset(s,0,sizeof(s));
memset(rs,0,sizeof(rs));
for(int i=0;i<n;i++)
scanf("%d",&num[i]);
int j=0,tempans;
scanf("%d",&tempans);
scanf("%s",s);
for(int i=0;i<strlen(s);i++)//中缀表达式r变后缀表达式rs
{
if(s[i]==' '||s[i]=='\t') continue;
else if(!op(s[i])) rs[j++]=s[i];
else
{
if(oper.empty()) { oper.push(s[i]); continue; }
else
{
if(s[i]=='(') { oper.push(s[i]); continue; }
else if(s[i]==')')
{
while(oper.top()!='(')
{ rs[j++]=oper.top(); oper.pop(); }
oper.pop();
}
else
{
while(!oper.empty()&&(rank(oper.top())>=rank(s[i])))
{ rs[j++]=oper.top(); oper.pop(); }
oper.push(s[i]);
}
}
}
}
while(!oper.empty())
{ rs[j++]=oper.top(); oper.pop();}
for(int i=0;i<n;i++)
path[i]=i;
int ok=0;
while(1)
{
cnt=0;
memset(al,-1,sizeof(al));
for(int i=0;i<strlen(rs);i++)//后缀表达式rs的计算
if((rs[i]>='a'&&rs[i]<='z')||(rs[i]>='0'&&rs[i]<='9')) solve.push(vary(rs[i]));
else
{
int x,y;
y=solve.top(); solve.pop(); x=solve.top(); solve.pop();
if(rs[i]=='+') solve.push(x+y);
if(rs[i]=='-') solve.push(x-y);
if(rs[i]=='*') solve.push(x*y);
}
int ans=solve.top();//得到结果
if(ans==tempans) {ok=1; break; }
if(!next_permutation(path,path+n)) break;
}
if(ok) puts("YES");
else puts("NO");
}
return 0;
}