zoukankan      html  css  js  c++  java
  • poj3295

    本题中最多5个命题变项:p,q,r,s,t

    每个有0,1两种取值,所以总共32种情况,分别枚举即可。

    对于每种情况,计算表达式的值,如果有结果为0的则输出not

    难点在于如何计算表达式的值,我们采用递归的方法,把表达式分为一或两个子表达式,并把参数end(本表达式的结束位置)传给上一层,一遍上一层获取第二个子表达式的起始位置。最后通过两个子表达式的结束位置,得到整个表达式的结束位置。

    end是本表达式的最后一位的下标,即本表达式的长度减一。

    所以 end = 2 + end1 + end2;

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    
    string p;
    bool v[5];
    
    bool getValue(string p, int &end)
    {
    	bool a, b;
    	int end1, end2;
    
    	if (p[0] >= 'p')
    	{
    		end = 0;
    		return v[p[0] - 'p'];
    	}
    	if (p[0] == 'N')
    	{
    		a = getValue(p.substr(1, p.length() - 1), end1);
    		end = end1 + 1;
    		return !a;
    	}
    	a = getValue(p.substr(1, p.length() - 1), end1);
    	b = getValue(p.substr(end1 + 2, p.length() - 1), end2);
    	end = 2 + end1 + end2;
    	switch (p[0])
    	{
    	case 'K':
    		return a && b;
    	case 'A':
    		return a || b;
    	case 'C':
    		return !a || b;
    	case 'E':
    		return !(a ^ b);
    	}
    	return 0;
    }
    
    int main()
    {
    	bool ok;
    
    	freopen("D:\\t.txt", "r", stdin);
    	while (getline(cin, p) && p != "0")
    	{
    		ok = true;
    		for (int i = 0; i < 32; i++)
    		{
    			for (int j = 0; j < 5; j++)
    				v[j] = (i >> j) % 2;
    			int x;
    			if (!getValue(p, x))
    			{
    				ok = false;
    				break;
    			}
    		}
    		if (ok)
    			cout << "tautology" << endl;
    		else
    			cout << "not" << endl;
    	}
    	return 0;
    }
  • 相关阅读:
    五、Docker网络管理
    四、Docker存储管理
    三、Docker镜像基础管理
    二、Docker容器基础管理
    模仿DotnetCore中间件的方式,做一个列表过滤的功能
    web开发常见的鉴权方式
    Go语言使用Godep进行包管理
    Go语言中的数据格式(json、xml 、msgpack、protobuf)
    epoll原理解释(转)
    内存管理之内存池概述(转)
  • 原文地址:https://www.cnblogs.com/rainydays/p/1948678.html
Copyright © 2011-2022 走看看