poj 3295 Tautology(构造法)

4 篇文章 0 订阅
1 篇文章 0 订阅


Tautology
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 11792 Accepted: 4467

Description

WFF 'N PROOF is a logic game played with dice. Each die has six faces representing some subset of the possible symbols K, A, N, C, E, p, q, r, s, t. A Well-formed formula (WFF) is any string of these symbols obeying the following rules:

  • p, q, r, s, and t are WFFs
  • if w is a WFF, Nw is a WFF
  • if w and x are WFFs, Kwx, Awx, Cwx, and Ewx are WFFs.
The meaning of a WFF is defined as follows:
  • p, q, r, s, and t are logical variables that may take on the value 0 (false) or 1 (true).
  • K, A, N, C, E mean and, or, not, implies, and equals as defined in the truth table below.
Definitions of K, A, N, C, and E
     w  x  Kwx  Awx   Nw  Cwx  Ewx
  1  1  1  1   0  1  1
  1  0  0  1   0  0  0
  0  1  0  1   1  1  0
  0  0  0  0   1  1  1

tautology is a WFF that has value 1 (true) regardless of the values of its variables. For example, ApNp is a tautology because it is true regardless of the value of p. On the other hand, ApNq is not, because it has the value 0 for p=0, q=1.

You must determine whether or not a WFF is a tautology.

Input

Input consists of several test cases. Each test case is a single line containing a WFF with no more than 100 symbols. A line containing 0 follows the last case.

Output

For each test case, output a line containing tautology or not as appropriate.

Sample Input

ApNp
ApNq
0

Sample Output

tautology
not


 判断是个给出的一个式子是不是永真式,p,q,r,s,t,是逻辑变量(0,1),K,N,A,C,E是关系

k   且   同时为真才为真

N 否  

A  同时为家才为假

C  1-->0 为假 ,其余都为真

E 相同时为真

判断是否为永真式,需要把所有的情况都表示出来,2^5种,每一种都判断

判断时用栈,判断的时候出了好多错



不规范代码(ac)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int flag;
char q[300];
char kk[200];
void panduan(int p,int qq,int r,int s,int t)
{
    char k[200];
    strcpy(k,kk);
    int i,j,n;
    int top=0;
    n=strlen(k);
    for(i=0;i<n;i++)
    {
        if(k[i]=='p'){k[i]=p+'0';}
        if(k[i]=='q'){k[i]=qq+'0';}
        if(k[i]=='r'){k[i]=r+'0';}
        if(k[i]=='s'){k[i]=s+'0';}
        if(k[i]=='t'){k[i]=t+'0';}
    }
    //printf("%s\n",k);
    for(i=0;i<n;i++)
    {
        //printf("%d \n",i);
        if(k[i]=='K' || k[i]=='A' || k[i]=='N' || k[i]=='C' || k[i]=='E')
        {
            q[top]=k[i];
            top++;
        }
        else if(k[i]=='0' || k[i]=='1')
        {
            if(q[top-1]=='N')
            {
                if(k[i]=='0'){q[top-1]='1';}
                if(k[i]=='1'){q[top-1]='0';}
            }
            else if(q[top-1]=='K' || q[top-1]=='A' || q[top-1]=='C' || q[top-1]=='E')
            {
                q[top]=k[i];
                top++;
            }
            else if(q[top-2]=='K')
            {
                if(k[i]=='1' && q[top-1]=='1'){q[top-2]='1';top-=1;}
                else {q[top-2]='0';top-=1;}
            }
            else if(q[top-2]=='A')
            {
                if(k[i]=='0' && q[top-1]=='0'){q[top-2]='0';top-=1;}
                else {q[top-2]='1';top-=1;}
            }
            else if(q[top-2]=='C')
            {
                if(k[i]=='0' && q[top-1]=='1'){q[top-2]='0';top-=1;}
                else {q[top-2]='1';top-=1;}
            }
            else if(q[top-2]=='E')
            {
                if(k[i]==q[top-1]){q[top-2]='1';top-=1;}
                else {q[top-2]='0';top-=1;}
            }
            else
            {
                q[top]=k[i];
                top++;
            }
        }
        if((q[top-2]=='N'&&(q[top-1]=='0'||q[top-1]=='1')) || ((q[top-1]=='0'||q[top-1]=='1')&& (q[top-2]=='1'||q[top-2]=='0') ))
        {
            k[i]=q[top-1];
            top--;
            i--;
        }
    }
   if(q[0]=='0')
   {
       flag=0;
   }

}
int main()
{
    int top,n,m,i,j;
    while(~scanf("%s",kk))
    {
        flag=1;
        if(kk[0]=='0')
        {
            break;
        }
        int p,qq,r,s,t;
        for(p=0;p<=1;p++)
        {
            for(qq=0;qq<=1;qq++)
            {
                for(r=0;r<=1;r++)
                {
                    for(s=0;s<=1;s++)
                    {
                        for(t=0;t<=1;t++)
                        {
                            panduan(p,qq,r,s,t);
                            if(flag==0)
                                break;
                        }
                        if(flag==0)
                                break;
                    }
                    if(flag==0)
                                break;
                }
                if(flag==0)
                                break;
            }
            if(flag==0)
                                break;
        }
        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、付费专栏及课程。

余额充值