博客
关于我
【ACM】POJ 3295 Tautology
阅读量:363 次
发布时间:2019-03-04

本文共 1335 字,大约阅读时间需要 4 分钟。

  该题的意思就是:给你一个表达式,判断它是否为永真式,若是输出tautology,否输出not。

  解题步骤:1.根据题内所示表格构造K,A,N,C,E的运算
                   2.枚举p,q,r,s,t的32种情况
                   3.表达式的计算
  注意事项:1.表达式为前置表达式,需从数组末尾开始遍历
                   2.全局变量每循环一次需重置
  ps:p,q,r,s,t的存储可用数组实现也可用map实现

 

#include 
#include
#include
#include
#include
using namespace std;char a[110];int num[5];int sign=1;//标记是否均符合要求 stack
cal;//运算栈int len;int calculate()//前缀表达式的运算 { int m,n; while(!cal.empty()) cal.pop(); for(int i=len-1;i>=0;i--) { if(a[i]=='p')//操作数部分 cal.push(num[0]); else if(a[i]=='q') cal.push(num[1]); else if(a[i]=='r') cal.push(num[2]); else if(a[i]=='s') cal.push(num[3]); else if(a[i]=='t') cal.push(num[4]); else//操作符部分 { m=cal.top();//取最顶上一个操作数,因为有非运算所以只取一个 cal.pop(); if(a[i]=='N') cal.push(!m); else { n=cal.top(); cal.pop(); if(a[i]=='K') cal.push(m&&n); else if(a[i]=='A') cal.push(m||n); else if(a[i]=='C') { if(m==1&&n==0) cal.push(0); else cal.push(1); } else if(a[i]=='E') { if(m==n) cal.push(1); else cal.push(0); } } } } return cal.top();} int main(){ while(cin.getline(a,110)) { if(a[0]=='0') break; len=strlen(a); for(int p=0;p<2&&sign;p++) { num[0]=p; for(int q=0;q<2&&sign;q++) { num[1]=q; for(int r=0;r<2&&sign;r++) { num[2]=r; for(int s=0;s<2&&sign;s++) { num[3]=s; for(int t=0;t<2&&sign;t++) { num[4]=t; if(calculate()==0) sign=0; } } } } } if(!sign) cout<<"not"<

 

转载地址:http://knzg.baihongyu.com/

你可能感兴趣的文章
MySQL数据库工具类之——DataTable批量加入MySQL数据库(Net版)
查看>>
mysql数据库常用命令
查看>>
MySQL数据库必会的增删查改操作(CRUD)
查看>>
MySQL数据库性能分析与调优实践
查看>>
mysql数据库扫盲,你真的知道什么是数据库嘛
查看>>
mysql数据库批量插入数据shell脚本实现
查看>>
MySQL数据库操作
查看>>
MySQL数据库故障排错
查看>>
MySQL数据库无法远程连接的解决办法
查看>>
mysql数据库时间类型datetime、bigint、timestamp的查询效率比较
查看>>
MySQL数据库服务器端核心参数详解和推荐配置(一)
查看>>
mysql数据库死锁的产生原因及解决办法
查看>>
MySQL数据库的事务管理
查看>>
mysql数据库的备份与恢复
查看>>
Mysql数据库的条件查询语句
查看>>
MySQL数据库的高可用
查看>>
Mysql数据库相关各种类型的文件
查看>>
MYSQL数据库简单的状态检查(show processlist)
查看>>
MYSQL数据库简单的状态检查(show status)
查看>>
MySQL数据库系列
查看>>