POJ 3295 Tautology(模拟)

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

题目意思:给定你一逻辑表达式,让你判断这个式子是不是永真式

这个题目对于有一点ACM基础的孩子来说都算是比较简单的一题

但是我却花了两小时 wa了数次

原因一:

误认为题目给的测试数据都会是保证从会面向前取值的时候都会满足取值到两个后(N除外)都会有一个逻辑符号等着他们,事实证明我错了,我wa的伤心死了

后来想到这点,但是不敢确定,就在default上测试那个条件 用个while(1)来测试,如果OJ返回超时,那么就说明我的猜想是对的,果然返回超时;

原因二:

这个错误发现的比较快,但是也不明显,就是switch语句,如果不在case语句后的都不会执行,下面的s--就是,哎呀,不应该啊!


           switch(name[len])
           {   s--;//这个语句永远都不会执行
               case 'K':ch=my_map[rec[s]]&&my_map[rec[s-1]] ? '1' : '0';s--;break;
               case 'A':ch=my_map[rec[s]]||my_map[rec[s-1]] ? '1' : '0';s--;break;
               case 'E':ch=my_map[rec[s]]==my_map[rec[s-1]] ? '1' : '0';s--;break;
               case 'C':ch=(!my_map[rec[s]])||my_map[rec[s-1]] ? '1' : '0';s--;break;
               case 'N':ch=my_map[rec[s]] ? '0' : '1';break;
              // default:printf("S:%d\n",s);
           }

然后就是这个题目解题了,按照正常情况来,模拟下栈就搞定了!

我这里pqr什么的都用map来对应真值,这样比较方便!


#include <iostream>
#include <stdio.h>
#include <map>
#include <string.h>
using namespace std;
char str[200];
char temp[200];
char rec[200];
map<char,bool> my_map;//这个map待会插入的时候注意0 and 1也插入一次
bool is_ok(char *name,int len)
{
    char ch;
    int s=0;
    len--;
    while(len>=0)
    {
     if(name[len]>='a' && name[len]<='z')
     {
         rec[s++]=name[len];
         len--;
     }
     else
     {
         s--;
          switch(name[len])
           {
               case 'K':ch=my_map[rec[s]]&&my_map[rec[s-1]] ? '1' : '0';s--;break;
               case 'A':ch=my_map[rec[s]]||my_map[rec[s-1]] ? '1' : '0';s--;break;
               case 'E':ch=my_map[rec[s]]==my_map[rec[s-1]] ? '1' : '0';s--;break;
               case 'C':ch=(!my_map[rec[s]])||my_map[rec[s-1]] ? '1' : '0';s--;break;
               case 'N':ch=my_map[rec[s]] ? '0' : '1';break;
           }
           rec[s++]=ch;
           len--;
     }
    }
    return my_map[rec[0]];
}
int main()
{
    int p,q,r,s,t,len;
    bool flag;
    while(scanf("%s",str))
    {
        flag=true;
        len=strlen(str);
        if(strcmp(str,"0")==0)
        return 0;
        for(p=0;p<2 && flag;p++)
        for(q=0;q<2 && flag;q++)
        for(r=0;r<2 && flag;r++)
        for(s=0;s<2 && flag;s++)
        for(t=0;t<2 && flag;t++)
        {
            my_map['0']=false;
            my_map['1']=true;
            strcpy(temp,str);
            my_map['p']=p;
            my_map['q']=q;
            my_map['r']=r;
            my_map['s']=s;
            my_map['t']=t;
            if(!is_ok(temp,len))
            flag=false;
            my_map.clear();
        }
        if(flag)
        printf("tautology\n");
        else
        printf("not\n");
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值