poj 3295 Tautology 构造法

转载 2018年04月17日 16:10:42

1.第二次做了还是没有思路

2.我是从字符串的长度考虑,如果长度=1 ,就会怎样 长度=3 就有多少种可能,并且打算用递归的算法,把一个字符串分解成几小部分来解,但是问题来了,我应该怎么分解对于一个字符串,第一个肯定是运算符,但是后面应该怎么拆分,拆分后又怎么能够利用子式。这些都无法解决

3. 看别人的解题思路,既然这和运算符有关的,那就考虑操作,这不就是我们学栈这个数据结构时的例题吗

3.同时我没有考虑枚举,我只考虑了肯定状态 即PP PNP,这些相同的的肯定能出现结果,不同的肯定不能出结果(对于一个小的式子来说)

转自https://www.cnblogs.com/kuangbin/archive/2012/08/13/2636855.html

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int MAXN=120;
int sta[MAXN];//数组实现堆栈
char str[MAXN];
int p,q,r,s,t;
void  DoIt()
{
    int top=0;
    int len=strlen(str);
    for(int i=len-1;i>=0;i--)
    {
        if(str[i]=='p') sta[top++]=p;
        else if(str[i]=='q') sta[top++]=q;
        else if(str[i]=='r') sta[top++]=r;
        else if(str[i]=='s') sta[top++]=s;
        else if(str[i]=='t') sta[top++]=t;
        else if(str[i]=='K')
        {
            int t1=sta[--top];
            int t2=sta[--top];
            sta[top++]=(t1&&t2);
        }
        else if(str[i]=='A')
        {
            int t1=sta[--top];
            int t2=sta[--top];
            sta[top++]=(t1||t2);
        }
        else if(str[i]=='N')
        {
            int t1=sta[--top];
            sta[top++]=(!t1);
        }
        else if(str[i]=='C')
        {
            int t1=sta[--top];
            int t2=sta[--top];
            if(t1==1&&t2==0)sta[top++]=0;
            else sta[top++]=1;
        }
        else if(str[i]=='E')
        {
            int t1=sta[--top];
            int t2=sta[--top];
            if((t1==1&&t2==1)||(t1==0&&t2==0)) sta[top++]=1;
            else sta[top++]=0;
        }
    }
}
bool solve()
{
    for(p=0;p<2;p++)
      for(q=0;q<2;q++)
        for(r=0;r<2;r++)
           for(s=0;s<2;s++)
              for(t=0;t<2;t++)
              {
                  DoIt();
                  if(sta[0]==0)return false;
              }
    return true;
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    while(scanf("%s",&str))
    {
        if(strcmp(str,"0")==0)break;
        if(solve())printf("tautology\n");
        else printf("not\n");
    }
    return 0;
}



同样用栈poj1068 Parencodings

也是模拟运算符类似的

其中最妙的是相减可以得到两个右括号之间的左括号数目

#include <iostream>
#include <cstring>
#include<stdio.h>
#include <stack>
using namespace std;

int main()
{
    int t,kk[100];
    cin>>t;
    while(t--)
    {
        stack<int> b;
        int len,a,t=0,k;
        cin>>len;

        for(int i=1; i<=len; i++)
        {
            cin>>a;
            kk[i]=a-t;
            t=a;
            for(int j=0; j<kk[i]; j++)
            {
                b.push(0);
            }

            if(b.top()==0)
            {
                b.pop();
                b.push(1);
                cout<<1;
                if(i==len) cout<<endl;
                else cout<<" ";
            }
            else
            {
                int ans=0;
                while(b.top()!=0)
                {
                    ans+=b.top();
                    b.pop();
                }
                b.pop();
                b.push(ans+1);
                cout<<ans+1;
                if(i==len) cout<<endl;
                else cout<<" ";
            }
        }




    }
    return 0;
}

POJ3295Tautology(构造法)

Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12088   Acc...
  • llzhh
  • llzhh
  • 2016-10-02 17:21:48
  • 827

POJ - 3295 - Tautology (构造)

题目传送:Tautology 思路:枚举所有变量可能的值(0或1),算出其表达式的值,因为题目是要求是否是永真式,求式子的真值可以用栈来求,栈的话,可以自己构造一个栈,也可以用STL的sta...
  • u014355480
  • u014355480
  • 2015-05-06 17:07:31
  • 916

POJ 3295 Tautology(构造法)

Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10004   Acc...
  • u014361775
  • u014361775
  • 2015-01-31 10:52:19
  • 389

POJ 3295 Tautology(构造法)

Time Limit: 1000MS Memory Limit: 65536K 题目地址:http://poj.org/problem?id=3295Problem Description...
  • xj949967574
  • xj949967574
  • 2016-09-21 22:17:13
  • 132

poj 3295 Tautology(构造法)

Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11792   Accepted: 4467 ...
  • ky961221
  • ky961221
  • 2016-07-27 18:01:48
  • 150

POJ 3295 Tautology(构造法 stack)

题目链接:http://poj.org/problem?id=3295 题意:给你一个逻辑表达式,让你判断是否是重言式 思路,对串进行解析,借助栈转求出所有情况的结果,一共是32种,枚举一遍! ...
  • sunrainchy
  • sunrainchy
  • 2014-02-17 11:10:06
  • 472

POJ 3295 Tautology (构造法 栈)

题目链接:http://poj.org/problem?id=3295 一整天也就出一个题都习惯了。自代码出来刷了一天的WA。 TAT 这个题就是给你一串逻辑关系表达式,让你判断是不是重言式,这个题有...
  • u012943138
  • u012943138
  • 2014-06-09 16:13:06
  • 797

POJ 3295 Tautology(递归、构造)

#include #include #include using namespace std; vector stack; //0代表false 1代表true. string s; int ju...
  • u011567017
  • u011567017
  • 2016-04-19 23:02:54
  • 169

[POJ 3295]Tautology[构造][DFS]

题目链接:[POJ 3295]Tautology[构造][DFS] 题意分析: 给出一个表达式,问:这个表达式是否是永真的?是的话,输出“tautology”,否则“not”。 其中变量最多有5...
  • CatGlory
  • CatGlory
  • 2016-01-12 09:59:33
  • 278
收藏助手
不良信息举报
您举报文章:poj 3295 Tautology 构造法
举报原因:
原因补充:

(最多只允许输入30个字)