• 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;
    }
  • 相关阅读:
    golang基础之第一个go程序
    golang基础之工程结构
    golang基础之初识
    Prometheus神器之监控K8s集群
    Kubernetes使用GlusterFS实现数据持久化
    Go使用Makefile构建
    快排的2种分区图解
    密钥交换之DH算法
    go mod使用
    socket常见选项之SO_REUSEADDR,SO_REUSEPORT
  • 原文地址:https://www.cnblogs.com/rainydays/p/1948678.html
Copyright © 2020-2023  润新知