首页 > 代码库 > 构造法
构造法
poj3295
题目不难,就是题意有点难理解(英语不好啊...)
题目的意思是一个式子只有pqrst和KANCE组成(一开始理解成小写字母都是变量了,不知道该如何枚举了),然后判断式子是否是永真式
用栈来进行计算,遇到变量入栈,遇到操作符取出栈中元素,运算结果再入栈,最后栈中剩余的结果就是最终计算的结果。
#include <iostream> #include <cstdio> #include <stack> #include <cstring> using namespace std; stack<int> s; int pp,qq,rr,ss,tt; bool isvalue(char a) { switch(a) { case ‘p‘:s.push(pp);return true; case ‘q‘:s.push(qq);return true; case ‘r‘:s.push(rr);return true; case ‘s‘:s.push(ss);return true; case ‘t‘:s.push(tt);return true; } return false; } void operators(char op) { switch(op) { case ‘K‘: { int x=s.top(); s.pop(); int y=s.top(); s.pop(); s.push(x&&y); break; } case ‘A‘: { int x=s.top(); s.pop(); int y=s.top(); s.pop(); s.push(x||y); break; } case ‘C‘: { int x=s.top(); s.pop(); int y=s.top(); s.pop(); s.push((!x)||y); break; } case ‘E‘: { int x=s.top(); s.pop(); int y=s.top(); s.pop(); s.push(x==y); break; } case ‘N‘: { int x=s.top(); s.pop(); s.push(!x); x=s.top(); //printf("re:%d\n",x); break; } } return; } int main() { char a[110]; while(cin>>a&&a[0]!=‘0‘) { int len = strlen(a); bool flag=1; for(pp=0;pp<=1;pp++) { for(qq=0;qq<=1;qq++) { for(rr=0;rr<=1;rr++) { for(ss=0;ss<=1;ss++) { for(tt=0;tt<=1;tt++) { for(int i=len-1;i>=0;i--) { if(!isvalue(a[i])) operators(a[i]); } flag=s.top(); s.pop(); if(!flag) break; } if(!flag) break; } if(!flag) break; } if(!flag) break; } if(!flag) break; } if(flag) cout<<"tautology"<<endl; else cout<<"not"<<endl; } }
构造法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。