CSU 1182: 表达式 1183: 计算表达式的值 1184: 格林布的地雷

1182: 表达式


#include <stdio.h>
#include <string.h>
#define INI 0
#define NUM 1
#define OPT 2
#define WRN -1
#define N 1024
int table[4][130];
char s[N];
int n;
void init()
{
    int state,ch;
    memset(table,0xff,sizeof(table));
    for(ch='0';ch<='9';ch++)    table[INI][ch]=table[NUM][ch]=table[OPT][ch]=NUM;
    table[INI]['+']=OPT;
    table[INI]['-']=OPT;

    table[NUM]['+']=OPT;
    table[NUM]['-']=OPT;
    table[NUM]['*']=OPT;
    table[NUM]['/']=OPT;
}
int dfa(int a,int b)
{
    int i,j,state=INI;
    if(a>b) return WRN;
    for(i=a;i<=b;i++)
    {
        if(s[i]==' ' || s[i]=='\t') continue;
        if(s[i]=='(')
        {
            if(state==NUM)   return WRN;
            int cnt=1;
            for(j=i+1;j<=b;j++)
            {
                if(s[j]=='(')    cnt++;
                else if(s[j]==')')    cnt--;
                if(cnt==0)   break;
            }
            if(cnt || dfa(i+1,j-1)!=NUM)  return WRN;
            state=NUM;
            i=j;
        }
        else state=table[state][s[i]];
        if(state==WRN)   return WRN;
    }
    if(state==NUM)  return NUM;
    return WRN;
}
int main()
{
    init();
    while(gets(s))
    {
        n=strlen(s);
        if(n==0)    puts("");
        else    printf("%s\n",dfa(0,n-1)==NUM?"Yes":"No");
    }
    return 0;
}
/**********************************************************************
	Problem: 1182
	User: 3901140225
	Language: C++
	Result: AC
	Time:0 ms
	Memory:1124 kb
**********************************************************************/

1183: 计算表达式的值


#include <stdio.h>
#define MAX (100 + 10)
char szData[MAX];

void TrimSpace(char* pszData)
{
    char* pszRead = pszData;
    char* pszWrite = pszData;
    while (*pszRead)
    {
        //由于数据中有\t,与先前题目描述不符合,不处理掉就直接超时了
        if (*pszRead != ' ' && *pszRead != '\t')
        {
            *pszWrite++ = *pszRead;
        }
        ++pszRead;
    }
    *pszWrite = '\0';
}

//nKind代表前一个运算符合的优先级,开始时是0,+-是1,*/是2
double Cal(char*& pszData, int nKind)
{
    double fAns = 0.0;
    while (*pszData && *pszData != ')')//表达式终止的条件是到达'\0'或者碰到右括号
    {
        if (*pszData >= '0' && *pszData <= '9')
        {
            fAns = 10 * fAns + *pszData - '0';
            ++pszData;
        }
        else if (*pszData == '+')
        {
            if (nKind >= 1)
            {
                return fAns;
            }
            ++pszData;
            fAns += Cal(pszData, 1);
        }
        else if (*pszData == '-')
        {
            if (nKind >= 1)
            {
                return fAns;
            }
            ++pszData;
            fAns -= Cal(pszData, 1);
        }
        else if (*pszData == '*')
        {
            if (nKind >= 2)
            {
                return fAns;
            }
            ++pszData;
            fAns *= Cal(pszData, 2);
        }
        else if (*pszData == '/')
        {
            if (nKind >= 2)
            {
                return fAns;
            }
            ++pszData;
            fAns /= Cal(pszData, 2);
        }
        else if (*pszData == '(')
        {
            ++pszData;
            fAns = Cal(pszData, 0);
            ++pszData;//移到')'后面
            return fAns;//一个括号内的是一个完整的表达式,因此直接返回
        }
    }
    
    return fAns;
}

int main()
{
    while (gets(szData))
    {
        TrimSpace(szData);
        char* pszData = szData;
        printf("%.4f\n", Cal(pszData, 0));
    }
}
/**********************************************************************
	Problem: 1183
	User: 3901140225
	Language: C++
	Result: AC
	Time:0 ms
	Memory:1120 kb
**********************************************************************/

1184: 格林布的地雷


#include <stdio.h>
#include <string.h>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define N 501
int n,m,g[N][N],d[N],path[N],top;
void dfs(int u)
{
    int v;
    for(v=1;v<=n;v++)
    {
        if(g[u][v])
        {
            g[u][v]--;
            g[v][u]--;
            dfs(v);
        }
    }
    path[top++]=u;
}
int main()
{
    int i,a,b,start;
    while(~scanf("%d",&m))
    {
        memset(g,0,sizeof(g));
        memset(d,0,sizeof(d));
        n=0;
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            g[a][b]++;
            g[b][a]++;
            d[a]++;
            d[b]++;
            n=MAX(n,MAX(a,b));
        }
        for(start=1;d[start]==0 && start<=n;start++);
        for(i=start;(d[i]&1)==0 && i<=n;i++);
        if(i<=n)    start=i;
        top=0;
        dfs(start);
        for(i=top-1;i>=0;i--)   printf("%d\n",path[i]);
    }
    return 0;
}
/**********************************************************************
	Problem: 1184
	User: 3901140225
	Language: C++
	Result: AC
	Time:4 ms
	Memory:2104 kb
**********************************************************************/


猜你喜欢

转载自blog.csdn.net/nameofcsdn/article/details/80003525
今日推荐