构造法

Posted Mel年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造法相关的知识,希望对你有一定的参考价值。

poj3295

题目不难,就是题意有点难理解(英语不好啊...)

 

题目的意思是一个式子只有pqrst和KANCE组成(一开始理解成小写字母都是变量了,不知道该如何枚举了),然后判断式子是否是永真式

用栈来进行计算,遇到变量入栈,遇到操作符取出栈中元素,运算结果再入栈,最后栈中剩余的结果就是最终计算的结果。

 

#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>

using namespace std;



stack<int> s;
int pp,qq,rr,ss,tt;

bool isvalue(char a)
{
     switch(a)
    {
        case p:s.push(pp);return true;
        case q:s.push(qq);return true;
        case r:s.push(rr);return true;
        case s:s.push(ss);return true;
        case t:s.push(tt);return true;
    }
    return false;
}



void operators(char op)
{
    switch(op)
    {
        case K:
            {
                int x=s.top();
                s.pop();
                int y=s.top();
                s.pop();
                s.push(x&&y);
                break;
            }
        case A:
            {
                int x=s.top();
                s.pop();
                int y=s.top();
                s.pop();
                s.push(x||y);
                break;
            }
        case C:
            {
                int x=s.top();
                s.pop();
                int y=s.top();
                s.pop();
                s.push((!x)||y);
                break;
            }
        case E:
            {
                int x=s.top();
                s.pop();
                int y=s.top();
                s.pop();
                s.push(x==y);
                break;
            }
        case N:
            {
                int x=s.top();
                s.pop();
                s.push(!x);
                x=s.top();
                //printf("re:%d\n",x);
                break;
            }
    }
    return;
}



int main()
{
   char a[110];
   while(cin>>a&&a[0]!=0)
   {
       int len = strlen(a);
       bool flag=1;
       for(pp=0;pp<=1;pp++)
       {
           for(qq=0;qq<=1;qq++)
           {
               for(rr=0;rr<=1;rr++)
               {
                   for(ss=0;ss<=1;ss++)
                   {
                       for(tt=0;tt<=1;tt++)
                       {
                           for(int i=len-1;i>=0;i--)
                           {
                               if(!isvalue(a[i]))
                                  operators(a[i]);
                           }
                           flag=s.top();
                           s.pop();
                           if(!flag) break;
                       }
                       if(!flag) break;
                   }
                   if(!flag) break;
               }
               if(!flag) break;
           }
           if(!flag) break;
       }
       if(flag)  cout<<"tautology"<<endl;
       else cout<<"not"<<endl;
   }
}

 

以上是关于构造法的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)减速(车速自减)修改车牌号,查询车的载重量。 编写两个构造方法:一个没有(代码片段

找到多个名为 [spring_web] 的片段。这对于相对排序是不合法的

Eratosthenes筛选法构造1-n 素数表

防止 Proguard 删除片段的空构造函数