题目:http://poj.org/problem?id=3295

AC代码(C++):

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <math.h>
#include <string.h>using namespace std;struct NODE{char a;NODE* left;NODE* right;
};int toTree(NODE* &root, char* str){if(str[0]=='\0')return 0;root = new NODE;root->left = NULL;root->right = NULL;root->a = str[0];if(root->a=='p'||root->a=='q'||root->a=='r'||root->a=='s'||root->a=='t'){return 1;}else if(root->a=='K'||root->a=='A'||root->a=='N'||root->a=='C'||root->a=='E'){int len1 = 0;int len2 = 0;len1 = toTree(root->left,str+1);if(root->a!='N')len2 = toTree(root->right,str+len1+1);return len1+len2+1;}
}void printTree(NODE* root){cout<<root->a<<' ';if(root->left!=NULL)printTree(root->left);if(root->right!=NULL)printTree(root->right);
}char caTree(NODE* root, char p, char q, char r, char s, char t){if(root->a=='p')return p;else if(root->a=='q')return q;else if(root->a=='r')return r;else if(root->a=='s')return s;else if(root->a=='t')return t;else if(root->a=='K'){char left = caTree(root->left,p,q,r,s,t);char right = caTree(root->right,p,q,r,s,t);if(left=='T'&&right=='T')return 'T';else return 'F';}else if(root->a=='A'){char left = caTree(root->left,p,q,r,s,t);char right = caTree(root->right,p,q,r,s,t);if(left=='F'&&right=='F')return 'F';else return 'T';}else if(root->a=='N'){char left = caTree(root->left,p,q,r,s,t);if(left=='F')return 'T';else return 'F';}else if(root->a=='C'){char left = caTree(root->left,p,q,r,s,t);char right = caTree(root->right,p,q,r,s,t);if(left=='T'&&right=='F')return 'F';else return 'T';}else if(root->a=='E'){char left = caTree(root->left,p,q,r,s,t);char right = caTree(root->right,p,q,r,s,t);if(left==right)return 'T';else return 'F';}
}int main(){char str[105];while(cin>>str){if(str[0]=='0')break;NODE* root;toTree(root,str);//printTree(root);char p,q,r,s,t;bool flag = true;for(int i = 0; i < 2; i++){if(i==0)p='T';else p='F';for(int j = 0; j < 2; j++){if(j==0)q='T';else q='F';for(int k = 0; k < 2; k++){if(k==0)r='T';else r='F';for(int l = 0; l < 2; l++){if(l==0)s='T';else s='F';for(int m = 0; m < 2; m++){if(m==0)t='T';else t='F';if(caTree(root,p,q,r,s,t)=='F')flag = false;}}}}}if(flag==true)cout<<"tautology\n";else cout<<"not\n";}
}

总结:

构造法, 将表达式构造成一颗二叉树, 树叶为各个变量, 树根为各个运算符. 然后枚举每个变量的值, 递归得到答案. 需要注意的是当运算符为not的时候只有左子树没有右子树. 如果程序不能AC的话可以去找一些离散证明题作为输入来调试.

POJ 3295.Tautology相关推荐

  1. poj 3295 Tautology(经典构造算法题)

    思路:1)使用递归模拟,用备忘录优化,否则超时 另外:学到了一个不用递归即可枚举构造0-1序列的方法 for(i=0;i<32;i++)for(j=0;j<5;j++)arr[j]=(i& ...

  2. POJ 3295: Tautology 递归的永真式

    原题链接:Tautology 题目大意:p.q.r.s.t是逻辑变量,K.A.N.C.E是逻辑操作,相应的真值表已经给出.要求给定一个逻辑表达式,判断其是否为永真式,即无论其中的逻辑变量取值如何,其结 ...

  3. 【poj 3295】Tautology (栈)

    做法:穷举五个变量的可能取值.对于每种情况,建立一个栈,从右往左遍历字符串,字符代表数字时入栈,代表运算符时取出一定量的数字,运算后把结果压入栈.最后剩下的就是这个运算式的结果了. 在所有的取值下结果 ...

  4. php验证码百度ocr识别,利用百度OCR实现验证码自动识别

    在爬取网站的时候都遇到过验证码,那么我们有什么方法让程序自动的识别验证码呢?其实网上已有很多打码平台,但是这些都是需要money.但对于仅仅爬取点数据而接入打码平台实属浪费.所以百度免费ocr正好可以 ...

  5. poj日记(3295)

    转载:https://www.cnblogs.com/kuangbin/archive/2012/08/13/2636855.html Description WFF 'N PROOF is a lo ...

  6. POJ ZOJ题目分类

    POJ,ZOJ题目分类(多篇整合版,分类很细致,全面) 标签: 题目分类POJ整理 2015-04-18 14:44 1672人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: ACM资料(5) ...

  7. POJ,ZOJ题目分类(多篇整合版,分类很细致,全面)

    水题: 3299,2159,2739,1083,2262,1503,3006,2255,3094 初级: 一.基本算法:        (1)枚举 (1753,2965)       (2)贪心(13 ...

  8. NOIP 好题推荐(DP+搜索+图论)POJ ZOJ

    NOIP好题推荐(DP+搜索+图论)POJ ZOJ 1370 Gossiping (数论->模线性方程有无解的判断)+(图论->DFS)  1090 Chain ->格雷码和二进制码 ...

  9. POJ 3268 D-Silver Cow Party

    http://poj.org/problem?id=3268 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...

  10. poj 2559 Largest Rectangle in a Histogram 栈

    // poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...

最新文章

  1. java perl_在Java中调用Perl脚本
  2. C++11中= delete;的使用
  3. Java零拷贝续——DirectByteBuffer内存回收
  4. java可比较的和比较器的区别_Java中Compareable和Comparator两种比较器的区别
  5. 如何删除需要管理员权限才能删除的文件夹
  6. springboot中获得app_在SpringBoot中读取环境变量
  7. “平行驾驶”是无人车上路的安全高效智能途径!
  8. .exe已停止工作_Windows 10累积更新KB4565503和KB4565483已发布
  9. Lightning 转 USB Type-A/Type-C 思路
  10. 物联网的应用涉及生活的方方面面,在这里介绍一下物联网的多种应用场景
  11. smartprinter 这个绝对程序猿的福音啊
  12. Windows 10出现0xc0000225错误代码如何解决?
  13. Web功能设计:登录与退出
  14. 学习笔记之MOOC《计算机程序设计C++》第5周编程作业
  15. Kotlin - 改良策略模式
  16. 关于墨客的DAPP锁仓开发
  17. 地推招生是我做过最苦的工作
  18. 嵌入式Linux_USB_U盘自动检测识别
  19. 12月php粉红色婚恋交友源码V6.0分享下载研究学习
  20. 【图像融合】基于随机游走算法实现多焦点图像融合含Matlab代码

热门文章

  1. Parallels Desktop的windows虚拟机无法打开iso文件
  2. 一张废手机卡的作用......
  3. CentOS7 配置与管理DHCP服务器及DHCP中继代理 DHCP服务实训整合
  4. WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED
  5. Windows与Linux之间的文件互传
  6. 并发编程之CompletableFuture全网最细最全用法(一)
  7. BUUCTF RSA题目全解1
  8. speechSynthesis没有声音
  9. 支持联发科cpu的linux系统,联发科发表 10 核心的新 Helio X20 处理器
  10. java学习php(一)基础知识