HLG 1523 Digit Sequence【表达式求解+欧拉通路or回路】
题意: 给出一连串的表达式,需要求出他们的结果,并且需要判断这些结果能否首尾相连成一个串,如果可以输出字典最小的那个串。
分析:表达式求解需要定义符号的优先级,并用栈来维护运算符和数值结果,
结果求出来后,可以对所有串按字典序排列,然后深搜找欧拉路径,第一次找到的即为字典序最小的那个。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define clr(x)memset(x,0,sizeof(x)) int res[1005][3]; struct node { int f,l; char s[33]; }q[1005]; int cmp(const void*p1,const void*p2) { node *c=(node*)p1; node *d=(node*)p2; return strcmp(c->s,d->s); } char s[33]; int isn(char c) { if(c>='0'&&c<='9') return 1; return 0; } int g[333][333]; void init() { g['+']['+']=g['+']['-']=g['+'][')']=g['+']['#']= g['-']['+']=g['-']['-']=g['-'][')']=g['-']['#']= g['*']['+']=g['*']['-']=g['*']['*']=g['*']['/']= g['*'][')']=g['*']['#']=g['/']['+']=g['/']['-']= g['/']['*']=g['/']['/']=g['/'][')']=g['/']['#']= g[')']['+']=g[')']['-']=g[')']['*']=g[')']['/']= g[')'][')']=g[')']['#']=1; g['('][')']=g['#']['#']=2; } int operat(int a,char c,int b) { if(c=='+') return a+b; if(c=='-') return a-b; if(c=='*') return a*b; return a/b; } int getres(char *s) { char opt[1000]; int num[1000]; int top1,top2,tmp,a,b,i; char c; top1=top2=0; opt[++top1]='#'; i=0; while(s[i]!='#'||opt[top1]!='#') { if(isn(s[i])){ tmp=0; while(isn(s[i])){ tmp=tmp*10+s[i]-'0'; i++; } num[++top2]=tmp; } else { if(g[opt[top1]][s[i]]==0){ opt[++top1]=s[i]; i++; } else if(g[opt[top1]][s[i]]==2){ top1--; i++; } else { b=num[top2--]; a=num[top2--]; c=opt[top1--]; tmp=operat(a,c,b); num[++top2]=tmp; } } } return num[top2]; } int v[1005]; int top,n,flag; int ans[1005]; void dfs(int k,int tot) { int i; if(flag)return; if(tot==n+1) { flag=1; for(i=0;i<top;i++) printf("%s%c",q[ans[i]].s,i==top-1?'\n':'.'); return; } for(i=1;i<=n;i++) { if(!v[i]&&q[i].f==k) { v[i]=1; ans[top++]=i; dfs(q[i].l,tot+1); v[i]=0; top--; } } } int main() { int t,i,j,ca=1,tmp; memset(g,0,sizeof(g)); init(); scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%s",s); tmp=getres(s); sprintf(q[i].s,"%d",tmp); q[i].f=q[i].s[0]-'0'; q[i].l=tmp%10; } clr(v); top=0; flag=0; printf("Case #%d:\n",ca++); qsort(q+1,n,sizeof(q[0]),cmp); for(i=1;i<=n;i++) { v[i]=1; ans[top++]=i; dfs(q[i].l,2); v[i]=0; top--; } if(flag==0) printf("NO DIGIT SEQUENCE\n"); printf("\n"); } return 0; }