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;
}

 

posted @ 2012-08-19 22:19  'wind  阅读(226)  评论(0编辑  收藏  举报