zoukankan      html  css  js  c++  java
  • poj3295解题报告(构造、算术表达式运算)

     

    POJ 3952,题目链接http://poj.org/problem?id=3295

    题意:

    输入由pqrstKANCE10个字母组成的逻辑表达式,

    其中pqrst的值为1true)或0false),即逻辑变量;

    KANCE为逻辑运算符,

    K --> and:  x && y

    A --> or:  x || y

    N --> not :  !x

    C --> implies :  (!x)||y

    E --> equals :  x==y

    输入格式保证是合法的,问这个逻辑表达式是否为永真式。

    思路:

    1. 从输入字符串末尾向前读取字符,构造一个栈,遇到pqrst则入栈,遇到N则取出栈顶一个值计算后入栈,遇到KACE则取栈顶两个值计算后入栈。最后栈内将只剩一个值,即该表达式的值。(与用栈计算算术表达式的方式一样)

    2. 一个5个逻辑变量,每种情况都要考虑,那么一共2^50x1f)种情况。

    代码:

    //560K	0MS
    
    #include <cstdio>
    #include <cstring>
    #include <stack>
    using std::stack;
    
    //K, A, N, C, E //逻辑符号
    //p, q, r, s, t //bool值
    char buf[101];
    stack<bool> s_stack;
    bool data[5]={false};
    bool WFF(char* str, int val)
    {
    	//init p q r s t
    	for (int i=0; i<5; ++i){
    		data[i] = (1<<i) & val;
    	}
    
    	while (! s_stack.empty()) s_stack.pop();
    	int strLen = strlen(str);
    	bool a,b;
    	while (--strLen >= 0)
    	{
    		switch (buf[strLen])
    		{
    		case 'p':
    			s_stack.push(data[0]);
    			break;
    		case 'q':
    			s_stack.push(data[1]);
    			break;
    		case 'r':
    			s_stack.push(data[2]);
    			break;
    		case 's':
    			s_stack.push(data[3]);
    			break;
    		case 't':
    			s_stack.push(data[4]);
    			break;
    		case 'K':
    			a=s_stack.top(); s_stack.pop();
    			b=s_stack.top(); s_stack.pop();
    			s_stack.push(a && b);
    			break;
    		case 'A':
    			a=s_stack.top(); s_stack.pop();
    			b=s_stack.top(); s_stack.pop();
    			s_stack.push(a || b);
    			break;
    		case 'N':
    			a=s_stack.top(); s_stack.pop();
    			s_stack.push(!a);
    			break;
    		case 'C':
    			a=s_stack.top(); s_stack.pop();
    			b=s_stack.top(); s_stack.pop();
    			s_stack.push(!a || b);
    			break;
    		case 'E':
    			a=s_stack.top(); s_stack.pop();
    			b=s_stack.top(); s_stack.pop();
    			s_stack.push(a == b);
    			break;
    		default:
    			break;
    		}
    	}
    	return s_stack.top();
    }
    
    int main()
    {
    	while (true)
    	{
    		memset(buf, 0, sizeof(char)*101);
    		scanf("%s", buf);
    		if (strcmp(buf, "0") == 0) break;
    
    		bool tautology = true;
    		for (int val=0; val<=0x1f; ++val)
    		{
    			if (! WFF(buf, val)){
    				tautology = false;
    				break;
    			}
    		}
    
    		if (tautology){
    			printf("tautology
    ");
    		}else {
    			printf("not
    ");
    		}
    	}
    
    	return 0;
    }
    
  • 相关阅读:
    大数据学习总结(7)we should...
    大数据学习总结(6)what is our foucus
    洛谷P4632 [APIO2018] New Home 新家(动态开节点线段树 二分答案 扫描线 set)
    BZOJ5249: [2018多省省队联测]IIIDX(线段树 贪心)
    BZOJ2438: [中山市选2011]杀人游戏(tarjan)
    cf1072D. Minimum path(BFS)
    cf1072B. Curiosity Has No Limits(枚举)
    cf567E. President and Roads(最短路计数)
    六校联考考试反思
    BZOJ4010: [HNOI2015]菜肴制作(拓扑排序 贪心)
  • 原文地址:https://www.cnblogs.com/songcf/p/3763651.html
Copyright © 2011-2022 走看看