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的实现方法,基本就是这道题的思路了!
之前学过的是运算符号的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的实现方法,基本就是这道题的思路了!
相关文章推荐
- MP3播放器团队项目
- 在一个字符串中提取子字符串
- phonegap3.4.0 创建工程
- java随堂笔记
- 创建maven项目,如何修改其jdk默认版本
- [06]常量、变量
- Qtcreator 常用快捷键总结
- PowerShell介绍 第一回 "Shell Everything"
- [05]数据
- OpenCV那个版本的比较好用、稳定,参考资料也较多的
- 为什么要io复用
- Android如何防止apk程序被反编译
- 使用第三方库MJRefresh上下刷新
- ioctl参数cmd=2错误
- get向服务器提交数据
- 随笔,第一天
- Android APK反编译就这么简单 详解(附图)
- 面向对象技术与UML的基本构造
- UML之状态图
- [04]注释