poj3295 Tautology —— 构造法

POJ3295-Tautology 北大POJ3295-Tautology 解题报告+AC代码 立即下载

题目链接:http://poj.org/problem?id=3295


题意:

输入由p、q、r、s、t、K、A、N、C、E共10个字母组成的逻辑表达式,

其中p、q、r、s、t的值为1(true)或0(false),即逻辑变量;

K、A、N、C、E为逻辑运算符,

K --> and:  x && y

A --> or:  x || y

N --> not :  !x

C --> implies :  (!x)||y

E --> equals :  x==y

问这个逻辑表达式是否为永真式。

PS:输入格式保证是合法的。


题解:一步一步地解决。1.首先需要记录变量,且操作时需要记录变量的值。所以就用一个ch[]记录变量,val[]记录变量的值(以val[ch[]-97]的形式记录,免去查找),并且记录变量的个数n。2.然后,变量需要“变”,然后就想到用dfs(),所以在每种情况中,变量都有确定的值。3.最后就是要处理这个逻辑表达式,一开始想直接在一个数组中处理,发现很难,要是逻辑表达式中海油逻辑表达式……,那该怎么处理。后来想到逆波兰表达式(没学,但却给了点启示),好像是用两个栈,对四则运算符和数字分开,什么遇到运算符就对数字进行操作,然后更新的,大概是这样。然后就想到:设一个主栈,初始化为输入的逻辑表达式,并设一个副栈,储存操作数。对主栈进行处理,遇到变量压入副栈,遇到操作码,提取副栈的操作数,进行操作并更新。一直到处理完主栈,最后副栈只剩下一个值。这个值就是:在变量为某些确定值时,这个逻辑表达式的真或假。



代码如下:


#include<stdio.h>//poj3295
#include<string.h>
//a为原始输入的字符串, ch用于保存变量,val用于保存变量的值
char a[105],ch[105],sm[105];
int val[30],ss[105];

int sum()
{   //sm为主栈,ss为副栈,op为操作数,rm和rs为对应的栈顶指针
    int op1,op2,rm,rs = -1;
    strcpy(sm,a);//初始化主栈
    rm = strlen(sm);
    while(--rm>=0)
    {   /*对主栈进行出栈操作,如果遇到变量,则压入副栈
          如果遇到操作码,则对副栈的数进行操作更新*/
        if(sm[rm]>='a' && sm[rm]<='z')
        {
            ss[++rs] = val[sm[rm]-97];
        }

        else
        {
            if(sm[rm]=='K')
            {
                op1 = ss[rs--], op2 = ss[rs];
                ss[rs] = (op1 && op2);
            }

            else if(sm[rm]=='A')
            {
                op1 = ss[rs--], op2 = ss[rs];
                ss[rs] = (op1 || op2);
            }

            else if(sm[rm]=='N')
            {
                ss[rs] = !ss[rs];
            }

            else if(sm[rm]=='C')
            {
                op1 = ss[rs--], op2 = ss[rs];
                ss[rs] = ((!op1)||op2);
            }

            else if(sm[rm]=='E')
            {
                op1 = ss[rs--], op2 = ss[rs];
                ss[rs] = (op1 == op2);
            }
        }
    }
    //返回最后的操作数,0或1
    return ss[0];
}

int dfs(int i,int n)
{   //用dfs对变量进行变化
    if(i==n)
    {
        if(sum())return 1;
        else return 0;
    }
    //如果出现假的情况,那肯定不是tautology, 那么余下的就不必判断,直接退出
    //所以将dfs()放到判断中去
    val[ch[i]-97] = 0;
    if(!dfs(i+1,n))return 0;
    val[ch[i]-97] = 1;
    if(!dfs(i+1,n))return 0;
    return 1;
}

int main()
{
    while(scanf("%s",a) && a[0]!='0')
    {
        int n = 0;
        for(int i = 0; a[i]!=0; i++)
        {   //记录变量
            if(a[i]>='a' && a[i]<='z')
            {
                int j;
                for(j = 0; j<n; j++)
                    if(a[i]==ch[j]) break;
                if(j==n)
                    ch[n++] = a[i];
            }
        }

        if(dfs(0,n))
            puts("tautology");
        else
            puts("not");
    }
    return 0;
}



看了一下网上的解题报告,可以对自己的代码进行优化:1.由于变量只有5个,所以可设5重循环来代替递归dfs(但是dfs根据变量的个数决定递归层次的,而循环则有点盲目)

2.由于变量最多只有5个,所以可直接射变量为p,q,r,s,t(但自己的方法可以是随便的变量)。3.处理逻辑表达式时,只需一个栈就够了,这个栈为上述代码的副栈。


代码如下(转载):


#include<string.h>
#include<stdio.h>
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()
{   //5重循环,枚举2^5  32种可能 如果都满足 return 1 
    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 0;
                    }
     return 1;
}
 
int main()
{
    while(scanf(%s,&str))
    {
        if(strcmp(str,0)==0)break;
        if(solve()) printf(tautology
);
        else printf(not
);
    }
    return 0;
}


有空再改进一下自己的代码,但仍喜欢用dfs。

等等,用dfs还怎么知道是哪个变量,看来还是用循环好,毕竟对题目有针对性。


谷歌学术用publish-or-perish来对引用量排序 用谷歌学术搜索文献的时候发现不能按照引用量高低进行排序,网上提供了这个软件。 下载地址如下:Publish or Perish (harzing.com)https://harzing.com/resources/publish-or-perish 关于软件界面页面和各种指标的介绍,可以参考中科大的这个PPT: 文献分析软件——publish or perish(精品·公开课件).ppt (book118.com)https://max.book118.com/html/2018/1124/813 阅读详情

相关推荐

论文阅读笔记--Grid Anchor based Image Cropping: A New Benchmark and An Efficient Model

基于网格锚的图片裁剪:一种新的标准和高效的模型摘要1.介绍2.相关工作2.1 图像裁剪数据集和评估指标 摘要 图像裁剪的目的是通过去除图像中无关的内容来改善图像的组成和美学质量。现有的图像裁剪数据库大多只提供一个或多个人工标注的边界框作为基准,难以反映实际中图像裁剪的非唯一性和灵活性。 采用IoU等评价指标也不能可靠地反映裁剪模型的真实性能。本文回顾了图像裁剪的问题,并通过考虑图像裁剪的特殊特性和要求(如局部冗余、内容保存、高宽比),提出了基于网格锚的公式。 我们的公式将候选裁剪窗口的搜索空间从数百万减少到

qq_22565865的博客 2948

Hunyuan AI架构解析:多模态融合与分布式训练优化

分布式训练是当前大规模AI模型开发的核心技术,通过数据并行、流水线并行等策略实现计算资源的高效利用。在异构计算架构下,GPU与NPU的混合调度能显著提升训练效率,特别是对于千亿参数大模型。多模态融合技术则通过统一表征学习,将视觉、文本等不同模态数据在共享隐空间中对齐,为工业级AI应用提供基础支持。Hunyuan技术体系创新性地结合动态稀疏注意力与混合精度训练,在保持模型精度的同时降低60%显存消耗,已在金融风控、智能客服等场景验证其工程价值。

alince20008的博客 500

TLV320AIC3204音频CODEC硬件设计与调试实战

本文深入解析了TLV320AIC3204音频CODEC的硬件设计与调试实战。文章从芯片功能定位入手,详细阐述了电源时钟设计、模拟输入电路等关键硬件设计要点,并提供了软件驱动配置与分层调试方法,帮助工程师有效规避常见陷阱,解决底噪、失真等典型音频调试问题。

zero1的博客 1124

poj3295 构造法

说是构造法,其实我觉得是活用了prefix与postfix表达式的处理方法,即stack的熟练运用。 之前学过的是运算符号的postfix转换,现在是逻辑符号。 没想到能一次ac啊好开心,感觉是新手的好运气啊。 #include #include #include using namespace std; vector V; bool isOperator(char o){ r

Jacoding的博客 408

别再一个个BAPI调了!用CVI_EI_INBOUND_MAIN一次性搞定SAP BP主数据(附完整ABAP代码)

本文详细介绍了如何使用SAP标准函数CVI_EI_INBOUND_MAIN高效维护业务伙伴(BP)主数据,替代传统的多BAPI调用方式。通过完整ABAP代码示例,展示了如何一站式处理供应商、客户、公司代码等所有视图的创建与更新,提升数据一致性和开发效率。

weixin_29204205的博客 294

scGPT-spatial 复现

文章摘要:Spatial scGPT项目复现流程 本文详细介绍了复现Spatial scGPT项目的完整流程,包含数据预处理、模型训练等关键步骤。首先需要使用scanpy加载H5AD文件并进行归一化、对数变换等预处理。然后构建基因词汇表(vocab),提取基因表达值和空间坐标信息。接着使用DataCollator进行数据分箱、掩码和填充处理。最后搭建TransformerModel进行训练。文章特别指出了需要自行补全的缺失部分,包括基因词汇表构建、空间坐标提取、数据集类定义和训练主循环脚本等。作者还提供了详

victory0431的博客 1683

POJ3295 栈

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

SCUT_Pein 725

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏5(附项目源码,完结)

本期是本项目的最后一篇,主要内容是配置环境、生成不同敌人、结束重开。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2575

POJ 3295 Tautology(构造法)

Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6088   Accepted: 2315 Description WFF 'N PROOF is a logic game played with dice. Each die has six f...

weixin_34080571的博客 189

SAP 成本分摊逻辑与案例(含具体数据)

摘要: SAP成本分摊通过**分配(Allocation)与分摊(Assessment)**两种方式,将间接成本中心费用按预设规则(如人数、工时、比例等)结转至直接成本对象。分配保留原始成本要素(如电费、工资),适用于需明细追踪的场景;分摊则打包为次级成本要素(如管理费用),简化核算。实操案例涵盖行政费用分配(按人数)、水电车间分摊(按工时)、机修作业分摊(作业成本法)及内部订单结算,系统通过KSV1/KSU1配置循环规则,KSV5/KSU5执行结转。关键点在于选择匹配业务的分摊基础,合理配置次级成本要素,

金牌架构师 551

MuJoCo 入门教程(一)

在 MuJoCo 仿真中输入自定义数字有三种方法。首先,可在 XML 中定义全局数字字段。它们有一个名称和一个实数值数组。其次,可以通过特定元素的自定义数组来扩展某些模型元素的定义。具体方法是在 XML 元素大小中设置 nuser_XXX 属性。第三,数组 mjData.userdata 不用于任何 MuJoCo 计算。用户可以在这里存储自定义计算的结果;请记住,所有随时间变化的内容都应存储在 mjData 中,而不是 mjModel 中。自定义文本字段可以保存在模型中。

机器人控制与仿真应用 1万+

POJ 3295 Tautology (构造法 栈)

题目链接:http://poj.org/problem?id=3295 一整天也就出一个题都习惯了。自代码出来刷了一天的WA。 TAT 这个题就是给你一串逻辑关系表达式,让你判断是不是重言式,这个题有两个难度点: 1.怎么判断这是不是一个重言式 2.逻辑语句是题目定义的语法,怎么知道这个逻辑语句描述的是什么   对于第一点,因为只有五个变量p,q,r,s,t,那么会有2^15次方种情况

顺便A道题 1542

【即插即用模块】Transformer篇 | ICCV 2025 | MALA :注意力分布神似Softmax,告别线性注意力性能短板!

MALA(Magnitude-Aware Linear Attention)是一种改进的线性注意力机制,通过引入缩放因子和偏移项,解决了传统线性注意力忽视查询幅度的问题,使其分布更接近Softmax Attention。该模块具有线性复杂度(O(n)),结合RoPE和LEPE编码实现全局-局部位置信息混合,通过z值调制平衡信息权重。实验表明MALA在轻量级视觉任务中能有效平衡效率与精度,注意力可视化显示其分布与Softmax Attention高度相似。代码提供完整的RoPE位置编码和线性注意力

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1107

poj3295 Tautology(构造法)

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 s

WA是一笔财富 419

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

poj 3295 Tautology【构造法】【刷题计划】

Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13580   Accepted: 5214 Description WFF 'N PROOF is a logic game played with dice. Eac

loving coding 794

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

POJ 3295 Tautology(构造法)

Time Limit: 1000MS Memory Limit: 65536K 题目地址:http://poj.org/problem?id=3295Problem Description WFF ‘N PROOF is a logic game played with dice. Each die has six faces representing some subset of

ZhaoYi1222的博客 391

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

构造法 | 栈 | POJ3295.Tautology

构造法 | 栈 | POJ3295.Tautology Link:Tautology 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,...

Redemption1997的博客 405

poj3295——Tautology(构造法)

DescriptionWFF ‘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

Beyond the Sora 1016

POJ 3295 Tautology (构造法)

Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7716   Accepted: 2935 Description WFF 'N PROOF is a logic game played with dice. Each die h...

weixin_34293246的博客 70

POJ3295Tautology(构造法)

Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12088   Accepted: 4608 Description WFF 'N PROOF is a logic game played with dice. Each die has si

llzhh的博客 1855

poj 3295 Tautology 构造法

1.第二次做了还是没有思路2.我是从字符串的长度考虑,如果长度=1 ,就会怎样 长度=3 就有多少种可能,并且打算用递归的算法,把一个字符串分解成几小部分来解,但是问题来了,我应该怎么分解对于一个字符串,第一个肯定是运算符,但是后面应该怎么拆分,拆分后又怎么能够利用子式。这些都无法解决3. 看别人的解题思路,既然这和运算符有关的,那就考虑栈操作,这不就是我们学栈这个数据结构时的例题吗3.同时我没有...

加油 (•̀ᴗ•́)و ̑̑ 267

POJ3295,Tautology,看到分类是构造法吓住了,主要是递归

Tautology 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 (

/ 836

Tautology(POJ3295-构造法)

Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13386   Accepted: 5123 Description WFF 'N PROOF is a logic(逻辑的) game played with dice(骰子). Each di

077CYW的博客 343
上一篇: poj2586 Y2K Accounting Bug —— 枚举
下一篇: poj3349 Snowflake Snow Snowflakes —— 哈希表
DOLFAMINGO
博客等级 码龄10年 8粉丝 216原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值