• POJ 3295 Tautology(枚举 + 构造)


    Tautology
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 5306   Accepted: 1997

    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 ofp. 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

    Source

    解题报告:就是判断所给的式子是否为永真式;其中K表示&&(并)A表示||(或),N表示!(非),C表示a->b(!a||b),E表示等值(a == b);他们的值有两种1或0,所以用枚举的方法,枚举一遍即可;
    代码如下:
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int N = 105;
    char str[N];
    int flag[6], st;
    int Judge()
    {
    int p, q;
    switch(str[++st])
    {
    case 'K': p = Judge(); q = Judge(); return p && q;
    case 'A': p = Judge(); q = Judge(); return p || q;
    case 'N': return !Judge();
    case 'C': p = Judge(); q = Judge(); return !p || q;
    case 'E': return Judge() == Judge();
    default: return flag[str[st] - 'p' ];
    }
    }
    int main()
    {
    int i, j, k, l, m, ans;
    while(scanf("%s", str) != EOF && str[0] != '0')
    {
    ans = 1;
    for (i = 0; i <= 1; ++i)//相当于枚举
    {
    flag[0] = i;
    for (j = 0; j <= 1; ++j)
    {
    flag[1] = j;
    for (k = 0; k <= 1; ++k)
    {
    flag[2] = k;
    for (l = 0; l <= 1; ++l)
    {
    flag[3] = l;
    for (m = 0; m <= 1; ++m)
    {
    flag[4] = m;
    st = -1;
    ans = ans && Judge();
    if (!ans)
    {
    break;
    }
    }
    }
    }
    }
    }
    if (ans)
    {
    printf("tautology\n");
    }
    else
    {
    printf("not\n");
    }
    }
    return 0;
    }
  • 相关阅读:
    最值得你学习的编程语言
    【收藏】程序员的资料库--技术文档、视频教程、电子书
    pig 安装
    MySQL导入.sql文件及常用命令
    win7下使用 EasyBCD 硬盘安装centOS
    Linux系统分区
    Hadoop实战教程视频
    中医药小分子和表观遗传重编程
    OpenSSL
    iOS 判断网络连接状态之重写Reachability
  • 原文地址:https://www.cnblogs.com/lidaojian/p/2367889.html
Copyright © 2020-2023  润新知