您的位置:首页 > 其它

poj3295 构造法

2015-11-07 15:55 309 查看
说是构造法,其实我觉得是活用了prefix与postfix表达式的处理方法,即stack的熟练运用。

之前学过的是运算符号的postfix转换,现在是逻辑符号。

没想到能一次ac啊好开心,感觉是新手的好运气啊。

#include <iostream>
#include <stack>
#include <vector>
using namespace std;
vector<char> V;
bool isOperator(char o){
return ((o=='N')||(o=='E')||(o=='C')||(o=='A')||(o=='K'));
}
bool make_expression(bool p, bool q,bool r,bool s,bool t){
bool expression,ex;
vector<char> v=V;
vector<bool> m;
while(!v.empty()){
if(!isOperator(v.back())){
if(v.back()=='p')
m.push_back(p);
else if(v.back()=='q')
m.push_back(q);

else if(v.back()=='r')
m.push_back(r);
else if(v.back()=='s')
m.push_back(s);
else if(v.back()=='t')
m.push_back(t);
v.pop_back();

}
else{
char ch=v.back();
v.pop_back();
switch (ch) {
case 'N':
expression=m.back();
m.pop_back();
m.push_back(!expression);
break;

case 'E':
expression=m.back();
m.pop_back();
ex=m.back();
m.pop_back();
m.push_back(expression==ex);
break;
case 'A':
expression=m.back();
m.pop_back();
ex=m.back();
m.pop_back();
m.push_back(expression||ex);
break;
case 'K':
expression=m.back();
m.pop_back();
ex=m.back();
m.pop_back();
m.push_back(expression&&ex);
break;
case 'C':
expression=m.back();
m.pop_back();
ex=m.back();

m.pop_back();
if(ex==false)
m.push_back(true);
else{
if(expression==true)
m.push_back(true);
else
m.push_back(false);
}
break;
default:
break;
}
}

}

return m[0];
}
void show(){
for(int p=0;p<2;p++){
for(int q=0;q<2;q++){

for(int r=0;r<2;r++){
for(int s=0;s<2;s++){
for(int t=0;t<2;t++)
if(!make_expression(p, q,r,s,t)){
cout<<"not"<<endl;
return;

}

}
}

}
}
cout<<"tautology"<<endl;

}
int main(int argc, const char * argv[]) {
// insert code here...

char c[100];
while(cin.getline(c, 100)){
if(c[0]=='0')
break;
else{
if(!V.empty())
V.clear();
for(int i=0;c[i]!='\0';i++){
char ch=c[i];
V.push_back(ch);
}
show();

}

}
return 0;
}其实运用的也是暴力的遍历法,因为考虑到总情况只有32中,所以还是可以的。
如果没有思路的话,可以去看一下Polish Reverse Notification的实现方法,基本就是这道题的思路了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: