zoukankan      html  css  js  c++  java
  • poj 3295 Tautology

    这题属于构造题,有两点需要想到:

    1、所谓永真式就是说题设中所给的五个逻辑变量无论如何取值,最终的运算结果总是为真,这里就需要枚举五个逻辑变量的取值情形。很容易想到共有32种情况:

    也就是说,对于每个字符串,如果这32种情况下的运算结果都是真的话, 那它就是永真式。1~32, 用按位与的办法,可以逐次枚举这32中情况。

    2、运算顺序:可以这样理解题目中的字符串结构,它就像一颗树,所以叶子节点做逻辑运算之后逐次汇聚到根节点得到最后的结果。于是想到从尾部开始(也就是从叶节点向上)。

    如果遇到逻辑变量,压栈;如果遇到二元逻辑运算,弹出两个元素,做二元运算,将结果压栈,如果遇到一元逻辑运算,弹出一个元素,做一元运算,将结果压栈。最后栈中必然只有一个元素。

    它为真,说明表达式为真,否则表达式为假:

    #include<iostream>
    #include<stack>
    #include<string>
    using namespace std;
    int main(){
    #ifndef ONLINE_JUDGE
    	freopen("input.txt", "r", stdin);
    #endif
    	char s[110];
    	while (scanf("%s", s) != EOF){
    		//while (getchar() != '
    ');
    		if (s[0] == '0')
    			break;
    		int len = strlen(s);
    		bool isTaut = true;
    		for (int i = 0; i < 32; i++){
    			stack<bool> st;
    			for (int j = len - 1; j >= 0; j--){
    				if (s[j] == 'K' || s[j] == 'A' || s[j] == 'N'
    					|| s[j] == 'C' || s[j] == 'E'){
    					if (s[j] == 'N'){
    						bool w = st.top();
    						st.pop();
    						st.push(!w);
    					}
    					else {
    						bool w = st.top();
    						st.pop();
    						bool x = st.top();
    						st.pop();
    						switch (s[j]){
    						case 'K':
    							st.push(w && x);
    							break;
    						case 'A':
    							st.push(w || x);
    							break;
    						case 'C':
    							st.push(!(w && !x));
    							break;
    						case 'E':
    							st.push(w == x);
    							break;
    						}
    					}
    				}
    				else {
    					st.push(i & (1 << (s[j] - 'p')));
    				}
    			}
    			if (!st.top()){
    				printf("not
    ");
    				isTaut = false;
    				break;
    			}
    			st.pop();
    		}
    		if (isTaut){
    			printf("tautology
    ");
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    常用的 JavaScript 简写方法
    user-select详解
    惊人的CSS和JavaScript动画logos例子
    debounce与throttle区别
    Vue.js中data,props和computed数据
    字体图标出现乱码的兼容方案
    ios调用Html内JS alert 不能点击关闭为甚?
    统一诊断服务 (Unified diagnostic services , UDS) (二)
    统一诊断服务 (Unified diagnostic services , UDS) (一)
    CAN总线同步
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4052811.html
Copyright © 2011-2022 走看看