POJ 3295 Tautology

POJ 3295 Tautology
大致题意:
对pqrst五个变量之间进行and, or, not, implies, equals五种逻辑运算,若给出的运算结果是恒为1的就输出tautology,否则输出not

这道题我用了列真值表的方式,因为总共就32种取值方式。

PQRST对应值
000000
000011
000102
000113
001004
001015

single[5][32]为pqrst的真值表。//本可以用int来操作,但是我还是太年轻了
令pqrst分别对应single二维数组的下标43210,

下面是完成single初始化的代码

for(int i=0;i<5;i++){//完成single的初始化
        single[i].resize(32,1);
        for(int j=0;j<32;j++){
            if(!(j&(1<<(i))))single[i][j]=0;
        }
    }

之后定义了各个逻辑运算的操作,因为基本都是复制粘贴,很好写。但是如果直接用and来命名会与库函数命名冲突,出现error: expected unqualified-id before ‘and’ token错误
下面是完整代码

#include <iostream>
#include <cmath>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <stack>
#include <queue>
#include <list>
#include <set>
#include <map>
#include <climits>
using namespace std;
typedef long long ll;

vector<bool > single[5];
vector<bool> ord(vector<bool> a,vector<bool> b)
{
    for(int i=0;i<32;i++){
        a[i]=(a[i]|b[i]);
    }
    return a;
}
vector<bool> notd(vector<bool> a){
    for(int i=0;i<32;i++){
        a[i]=!a[i];
    }
    return a;
}
vector<bool> andd(vector<bool> a,vector<bool> b)
{
    for(int i=0;i<32;i++){
        a[i]=(a[i]&b[i]);
    }
    return a;
}

vector<bool> equalsd(vector<bool> a,vector<bool> b)
{
    for(int i=0;i<32;i++){
        a[i]=(a[i]==b[i]);
    }
    return a;
}

vector<bool> impliesd(vector<bool> a,vector<bool> b)
{
    for(int i=0;i<32;i++){
        a[i]=((!a[i])|(b[i]));
    }
    return a;
}
inline int toInt(char c){
    return 4-c+'p';
}
bool is_tau(vector<bool> a){
    for(int i=0;i<32;i++){
        if(a[i]==0)return 0;
//        cout<<a[i]<<endl;
    }
    return 1;
}
string in;
int find_next(int i){//下一个的头
    int k=1;
    for(;i<in.size();i++){
        if(in[i]>='A'&&in[i]<='Z'&&in[i]!='N'){
            k++;
        }
        else if(in[i]!='N'){
            k--;
            if(!k)return i+1;
        }
    }
    return i;
}
vector<bool> toLogi(int L,int R){
    if(in[L]>='p'&&in[L]<='t'){
        vector<bool> c(single[toInt(in[L])]);
        return c;
    }
    int s;
    switch(in[L]){
        case 'K':
            s=find_next(L+1);//
            return andd(toLogi(L+1,s-1),toLogi(s,R));
            break;
        case 'A':
            s=find_next(L+1);//
            return ord(toLogi(L+1,s-1),toLogi(s,R));
            break;
        case 'N':
            s=find_next(L+1);//
            return notd(toLogi(L+1,s-1));

            break;
        case 'C':
            s=find_next(L+1);//
            return impliesd(toLogi(L+1,s-1),toLogi(s,R));

            break;
        case 'E':
            s=find_next(L+1);//
            return equalsd(toLogi(L+1,s-1),toLogi(s,R));

            break;
    }
}
int main()
{
    for(int i=0;i<5;i++){
        single[i].resize(32,1);
        for(int j=0;j<32;j++){
            if(!(j&(1<<(i))))single[i][j]=0;
        }
    }
    while(cin>>in){
        if(in=="0")break;
        if(is_tau(toLogi(0,in.size()-1)))
            cout<<"tautology"<<endl;
        else cout<<"not"<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值