Cod sursa(job #2115842)

Utilizator victorv88Veltan Victor victorv88 Data 27 ianuarie 2018 10:42:37
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int val[30];
char sirinit[1005], x[1000][5], nr=0,n, a[5], q=0;

void formaresubsir()
{
    for (int i=0; i<=n; i++)
    {
        if (sirinit[i]==' ')
        {
            if (strlen(a))
                strcpy(x[nr++],a);
            memset(a,0,5);
            q=0;
            continue;
        }
        else if (sirinit[i]=='(')
        {
            if (strlen(a))
            {
                strcpy(x[nr++],a);
            }
            memset(a,0,5);
            strcpy(x[nr++],"(");
            q=0;
            continue;
        }
        else if (sirinit[i]==')')
        {
            if (strlen(a))
            {
                strcpy(x[nr++],a);
            }
            memset(a,0,5);
            strcpy(x[nr++],")");
            q=0;
            continue;
        }
        else
        {
            a[q++]=sirinit[i];
        }
    }
}

void verifparanteze(int &st, int &dr)
{
    int nr1=0, ok=1;
    while (strcmp(x[st],"(")==0 && strcmp(x[dr],")")==0 && nr1==0 && ok==1)
    {
        nr1=0;
        for (int i=st+1; i<=dr-1 && ok==1; i++)
        {
            if (strcmp(x[i],")")==0)
                nr1--;
            else if (strcmp(x[i],"(")==0)
                nr1++;
            if (nr<0)
                ok=0;
        }
        if (nr==0 && ok==1)
            st++,dr--;
    }
}

int cautare(char de[5],int st, int dr)
{
    int nr1=0;
    for (int i=dr; i>=st; i--)
    {
        if (strcmp(x[i],")")==0)
            nr1--;
        else if (strcmp(x[i],"(")==0)
            nr1++;
        if ((strcmp(x[i],de)==0)&& nr1==0)
            return i;
    }
    return -1;
}

int valoare(int st)
{
    char car=x[st][0];
    return val[car-65];
}

bool eval(int st, int dr)
{
    if (st>dr)
        return false;
    verifparanteze(st,dr);
    int p=cautare("OR",st,dr);
    if (p==-1)
    {
        p=cautare("AND",st,dr);
        if (p==-1)
        {
            p=cautare("NOT",st,dr);
            if (p==-1)
                return valoare(st);
        }
    }
    int v1=eval(st,p-1);
    int v2=eval(p+1,dr);
    if (strcmp(x[p],"OR")==0)
    {
        return (v1||v2);
    }
    if (strcmp(x[p],"AND")==0)
        return (v1&&v2);
    if (strcmp(x[p],"AND")==0)
        return (!v2);
}

int main()
{
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);;
    fgets(sirinit,1000,stdin);
    n=strlen(sirinit);
    if (sirinit[n-1]=='\n')
    {
        sirinit[n-1]='\0';
        n--;
    }
    formaresubsir();
    cout << eval(0,nr-1);
    return 0;
}