构造法 | 栈 | POJ3295.Tautology

Link:Tautology

Description
WFF 'N PROOF is a logic game played with dice. Each die has six faces representing some subset of the possible symbols K, A, N, C, E, p, q, r, s, t. A Well-formed formula (WFF) is any string of these symbols obeying the following rules:

  • p, q, r, s, and t are WFFs
  • if w is a WFF, Nw is a WFF
  • if w and x are WFFs, Kwx, Awx, Cwx, and Ewx are WFFs.

The meaning of a WFF is defined as follows:

  • p, q, r, s, and t are logical variables that may take on the value 0 (false) or 1 (true).

  • K, A, N, C, E mean and, or, not, implies, and equals as defined in the truth table below.

    w x Kwx Awx Nw Cwx Ewx
    1 1 1 1 0 1 1
    1 0 0 1 0 0 0
    0 1 0 1 1 1 0
    0 0 0 0 1 1 1

A tautology is a WFF that has value 1 (true) regardless of the values of its variables. For example, ApNp is a tautology because it is true regardless of the value of p. On the other hand, ApNq is not, because it has the value 0 for p=0, q=1.

You must determine whether or not a WFF is a tautology.

Input
Input consists of several test cases. Each test case is a single line containing a WFF with no more than 100 symbols. A line containing 0 follows the last case.

Output
For each test case, output a line containing tautology or not as appropriate.

Sample Input

ApNp
ApNq
0

Sample Output

tautology
not

Source
Waterloo Local Contest, 2006.9.30

题意
p q r s t 为5个逻辑变量,取值可取为0, 1
K A N C E为5种逻辑运算,分别为 与,或, 非, 蕴含,相等;
即 Kwx = w && x; Awx = w || x; Nw = !w; Cwx = (!w) || x; Ewx = (w == x);
先给出一个合法的合式公式,判断其是否为永真式。

思路
首先分析 ApNp的运算法则:ApNp = A( p, N(p) ); 它是一种层层嵌套的运算方法,让我想起了后缀表达式的计算,例如abc+*,采用栈的方式,从左到右进行压栈。此题的运算方式类似于后缀表达式,但由于运算符在前,变量在后,所以仿照后缀表达式求值的方法,应该从尾部向前迭代。迭代方式为:
1.如果当前字符为变量,则将其压入变量栈
2.如果当前字符为运算符,首先看运算符类型
    a.若当前是一目运算符(N),则出栈一个元素,运算后将结果压入变量栈
    b.若当前是二目运算符,将出栈两个元素运算后将其压入变量栈
将此次迭代完成时,变量栈只有一个元素,他就是此合式计算的结果。
题目要求判断为永真式,共给出5个变量,所以让每个变量分别取0,1,共32种取值方式,若所有情况下该式结果均为1,则此式为永真式,否则不是。

小技巧:5个变量分别取0,1一般而言采取5个循环,这里采用了一个char变量的后五位对应5个变量的取值。
做法是设置一个编码code从0x00自增到0x1F; 要取每一位的值时,设置这一位的掩码,编码与掩码相与后向右移位即可得到这一位的值。
例如: char code = 0x05, 即0B00000101,要取第3位r的值,则设置r的掩码MASK=0x04, 相与后得到0x04,向右移两位即得到当前值。即(code&R_MASK)>>2

这道题A了好久,说一下我踩过的坑
1. 这里设置了一个全局的栈, 所以在计算每一个code相应的合式的值时应该将栈初始化。就因为我这个没有注意debug了好久
2.遍历所有取值的条件应该为 code <= ENUM_CODE 而不是<

代码

#include <iostream>
#include <cstring>
#include <stack>#define N(w) (!(w))
#define K(w,x) (w&&x)
#define A(w,x) (w||x)
#define C(w,x) ((!w)||x)
#define E(w,x) (w==x)using namespace std;const char P_MASK = 0x01;
const char Q_MASK = 0x02;
const char R_MASK = 0X04;
const char S_MASK = 0X08;
const char T_MASK = 0X10;
const int MAX_LEN = 101;const char ENUM_CODE = 0x1F;
char code = 0x00;
bool flag;
char WFF[MAX_LEN];stack<char> var;char toValue( char c )
{char val = 2;switch( c ){//注意: 运算符优先级 == 高于 &case 'p': val = ((code&P_MASK)==0?0:1); break;case 'q': val = (((code&Q_MASK)>>1)==0?0:1); break;case 'r': val = (((code&R_MASK)>>2)==0?0:1); break;case 's': val = (((code&S_MASK)>>3)==0?0:1); break;case 't': val = (((code&T_MASK)>>4)==0?0:1); break;default : val = 2;}//cout << "val: " << val << endl;return val;
}bool isTautology()
{int len = strlen(WFF);char c, value;char w, x;int i;for( i = len-1; i >= 0; i-- ){c = WFF[i];value = toValue(c);if( value < 2 )var.push( value );else if( c == 'N' ){w = var.top();var.pop();var.push( N(w) );}else{w = var.top();var.pop();x = var.top();var.pop();if( c == 'K' )  var.push( K(w,x) );else if( c == 'A' ) var.push( A(w,x) );else if( c == 'C' ) var.push( C(w,x) );else var.push( E(w,x) );}}c = var.top();if( c == 1 )return true;elsereturn false;
}int main()
{while( cin >> WFF && WFF[0] != '0' ){flag = true;for( code = 0; code <= ENUM_CODE; code++){   while( !var.empty() )var.pop();flag = isTautology();if( !flag ){cout << "not" << endl;break;}}if( flag )cout << "tautology" << endl;}
}

构造法 | 栈 | POJ3295.Tautology相关推荐

  1. LeetCode42题,单调栈、构造法、two pointers,这道Hard题的解法这么多?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第23篇文章. 今天来看一道很有意思的题,它的难度是Hard,并且有许多种解法. 首先我们来看题面,说是我们有若 ...

  2. 子集生成算法 之 位向量法和增量构造法

    什么是子集生成? 算法竞赛经典入门中的解释:给定一个集合,枚举所有的可能的子集. 位向量法 1.什么是位向量法? 通过构造一个标记向量pd[i],而不直接构造存放题目数据的子集A. 当pd[i]==t ...

  3. [编译原理随记]正则表达式转为NFA状态图(Thompsion构造法)

    上级文章 [编译原理随记]正则表达式记号和状态图:https://blog.csdn.net/qq_28033719/article/details/107067798 [编译原理随记]NFA转DFA ...

  4. 机器人雅可比矩阵的求法_构造法

    机器人雅可比矩阵的求法_构造法 雅可比矩阵对于机器人运动学逆解.静力学分析和动力学分析有重要意义,是机器人位置\力控制的基础.这篇文章主要讲如何用构造法求解雅可比矩阵. 上一篇文章中讲到,D-H矩阵中 ...

  5. 《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.3 构造法模拟的实验范例...

    2.3 构造法模拟的实验范例 构造法模拟需要完整.精确地构造出反映问题本质的数学模型,根据该模型设计状态变化的参数,计算模拟结果.由于数学模型建立了客观事物间准确的运算关系,因此其效率一般比较高. 构 ...

  6. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  7. 【编译原理】:NFA转变为DFA的子集构造法

    整体的步骤是三步:  一,先把正规式转换为NFA(非确定有穷自动机),  二,在把NFA通过"子集构造法"转化为DFA,  三,在把DFA通过"分割法"进行最小 ...

  8. LL1分析构造法_16条数学得分法,想提分快来看!

    距离高考不足百日,在注重数学基础的同时,也要注重技巧,好迅速拿分,今天送同学们一份数学得分法,帮助同学们最大限度得分,在高考中取得最高分! 1.圆锥曲线中最后题往往联立起来很复杂导致k算不出,这时你可 ...

  9. LL1分析构造法_行测技巧:比较构造法两步轻松解决方程题

    所谓比较构造法,指的是对同一事物进行两种不同维度的描述,通过找到其中的差异,从而构造等量关系.定义当中有两个非常重要的要点需要着重把握. 一.应用环境:同一事物.两种不同维度的描述 比较构造法最主要的 ...

最新文章

  1. ant+svn+tomcat实现项目自动部署
  2. 机器学习——正则化-L2
  3. 关于表单回车自动提交的讨论
  4. Qt 开源作品 | 小伙子,给你的 Linux 系统写个 Launcher 吧
  5. android于src和background差额
  6. 安装inotify-tools,用inotifywait命令监听文件或目录的访问信息
  7. 王不可以怒而兴师,将不可以愠而致战
  8. 利用SPSS做数据分析①(了解SPSS)
  9. STM8(STM8S003F3) Bootloader (IAP) 升级程序
  10. [Zinnia][Windows]手写输入法的一些研究
  11. RS232串口线连接方法
  12. matlab画图形函数 semilogx semilogy和loglog
  13. Photoshop如何使用图像调色之实例演示?
  14. Word如何对齐冒号,想把几行的冒号对齐该怎么设置?
  15. 连续十日票房日冠,《人生大事》带热了电影大盘!它凭何突出重围?
  16. response.reset()
  17. Linux sysrq功能
  18. LeetCode报错: “runtime error: member access within null pointer of type ‘struct ListNode”
  19. 数据集成工具 —— datax与flinkx的使用
  20. Mac电脑如何启用root用户

热门文章

  1. oracle的常用l函数,oracle常用sql函数和语句
  2. Python脚本打开默认浏览器登录人人和打开QQ
  3. 完美解决 ListView偶尔爆出的异常:java.lang.IllegalStateException
  4. 指令大全(win+r)
  5. 亚马逊、Lazada、Shopee、wish、eBay、速卖通、阿里国际、沃尔玛、newegg、mercari测评(补单)自养号,风控严情况下,卖家们要如何保障自己的安全?
  6. tomcat官网如何下载旧版本
  7. 苹果Safari浏览器Safari Technology Preview
  8. html让圆点闪烁,canvas闪烁的圆点灯光特效
  9. HTML5期末大作业:企业网页设计——摄影店铺5页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
  10. matlab root什么意思,root是什么意思?