题解 P1575 【正误问题】
biqinyiming20 · · 题解
看这么多大佬都发了栈的做法,本蒟蒻决定发一个暴力模拟的代码......
如下:
#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;
}