您的位置:首页 > 其它

POJ 3295 Tautology(模拟)

2013-08-05 11:27 405 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  模拟 算法