题解 P1575 【正误问题】

· · 题解

看这么多大佬都发了栈的做法,本蒟蒻决定发一个暴力模拟的代码......

如下:

#include<bits/stdc++.h>
using namespace std;
int a[256];
int main(){
    string s2;
    for(int i=1;i<255;i++)//设一个不为0,1,2,3,4的初值,以免后面的判定出错 
    a[i]=1000;
    while(cin>>s2){
        if(s2=="true")a[++a[0]]=1;
        if(s2=="false")a[++a[0]]=0;
        if(s2=="or")a[++a[0]]=2;
        if(s2=="and")a[++a[0]]=3;
        if(s2=="not")a[++a[0]]=4;
    }
    //对于循环的方向,理论上来说从前走还是从后走结果都是一样的。不信的话可以自己举几个例子算一算
    //然而对于not来说,后走比前走更容易判定error
    //而且or,and前后走判定都一样
    //所以在这里我选择了后走 
    for(int i=a[0];i>0;i--){
        if(a[i]==4){
            if(a[i+1]!=1&&a[i+1]!=0){//not判断它后面的一个数是否为true或false就好 
                printf("error\n");
                return 0;
            }
            a[i+1]=not(a[i+1]);
            for(int j=i+1;j<=a[0];j++)
            a[j-1]=a[j];
            a[0]--;
        }
    }
    for(int i=a[0];i>0;i--){
        if(a[i]==3){
            if((a[i+1]!=1&&a[i+1]!=0)||(a[i-1]!=1&&a[i-1]!=0)){//and和or判断它前后的两个数是否都为true或false
                printf("error\n");
                return 0;
            }
            a[i+1]=(a[i-1])and(a[i+1]);
            for(int j=i+1;j<=a[0];j++)
            a[j-2]=a[j];
            a[0]-=2;
        }
    }
    for(int i=a[0];i>0;i--){
        if(a[i]==2){
            if((a[i+1]!=1&&a[i+1]!=0)||(a[i-1]!=1&&a[i-1]!=0)){
                printf("error\n");
                return 0;
            }
            a[i+1]=(a[i-1])or(a[i+1]);
            for(int j=i+1;j<=a[0];j++)
            a[j-2]=a[j];
            a[0]-=2;
        }
    }
    if(a[0]!=1)cout<<"error";//如果a[0]!=1,那么这个式子就是有两个式子合在一起而成的,判error 
    else if(a[1])cout<<"true";
    else cout<<"false";
    return 0;
}