首页 > 其他分享 >U433730 为了人类的未来,让我们做离散数学上机题吧

U433730 为了人类的未来,让我们做离散数学上机题吧

时间:2024-05-22 20:08:36浏览次数:15  
标签:count isHere 上机 gouzhao father ne 离散数学 U433730 析取范式

为了人类的未来,让我们做离散数学上机题吧

题目背景

李昕峰同学致力于研究可控核聚变技术,每天废寝忘食,呕心沥血,抽不出空写离散作业。你身为李昕峰的同学,为了国家的未来,为了人类科技的发展,为了以后人类能够安全有效地使用核能,你需要帮助李昕峰同学完成他的离散作业。你不需要写很多,因为李昕峰已经写了一部分了,只剩下析取范式转化为主析取范式这部分没写,你的任务是编写一个程序,把析取范式转化为主析取范式。

题目描述

给你一个析取范式,请你编写程序将其转化为主析取范式输出出来。

输入格式

第一行输入一个数字 \(n(1\leqslant n \leqslant16)\),表示共有的命题个数

第二行输入\(n\)个命题的名字某大写字母

第三行输入一个析取范式(每个命题之间用空格隔开,同时将合取的式子用括号括在一起,取非用~,析取符号用小写字母v表示。(参考样例)(我们保证~和命题某大写字母是连在一起的)

输出格式

输出一行主析取范式(请你保证~和命题某大写字母是连在一起的,单元与单元之间用英文括号和小写字母v隔开)

样例 #1

样例输入 #1

3
P Q R
(P ^ Q ^ R) v (P ^ ~Q)

样例输出 #1

(P ^ Q ^ R) v (P ^ ~Q ^ R) v (P ^ ~Q ^ ~R)

真值表秒了!!!

我的思路就是把合取式转化为真值表,最后输出结果。
关键代码
构造真值表函数

void gouzhao(int n, string ne)
{
    bool upLcx = isHere.count(arr[n]) ? true : false;
    bool downLcx = isHere.count(brr[n]) ? true : false;

    if (upLcx && downLcx)
        return;
    if (n == all)
    {
        q.insert(ne);
        return;
    }
    if (upLcx)
        gouzhao(n + 1, ne + "1");    //如果是真的,构造1
    else if (downLcx)
        gouzhao(n + 1, ne + "0");     //假的,构造0
    else                              //没写真假,构造0和1
    {
        gouzhao(n + 1, ne + "0");
        gouzhao(n + 1, ne + "1");
    }
}

数据预处理,即把(P ^ ~Q ^ R)转化为PqR

rep(i, 0, all) cin >> arr[i];
rep(i, 0, all) brr[i] = arr[i] - 'A' + 'a';

string father;
    string son = "";
    getline(cin, father);

rep(i, 0, (int)father.size())
{
    if (father[i] >= 'A' && father[i] <= 'Z')
        son += father[i];
    else if (father[i] == '~')
        son += father[++i] - 'A' + 'a';
    else if (father[i] == 'v')
        son += ' ';
    }

第一步构造

stringstream ss;
ss << son;

while (ss >> s)
{
    isHere.clear();
    rep(i, 0, (int)s.size()) isHere.insert(s[i]);

    if (isHere.count(arr[0]) && isHere.count(brr[0]))
        continue;

    if (isHere.count(arr[0]))
        gouzhao(1, "1");
    else if (isHere.count(brr[0]))
        gouzhao(1, "0");
    else
    {
        gouzhao(1, "0");
        gouzhao(1, "1");
    }
}

输出部分

for (auto it = q.begin(); it != q.end(); it++)
    {
        if (it != q.begin())
            cout << "v";
        cout << "(";
        rep(i, 0, all)
        {
            if (i)
                cout << "^ ";
            if ((*it)[i] == '0')
                cout << "~" << arr[i] << " ";
            else if ((*it)[i] == '1')
                cout << arr[i] << " ";
        }
        cout << ")";
    }

写在最后

特别鸣谢李老师,感谢他对于题目格式以及测试点信息的帮助。

标签:count,isHere,上机,gouzhao,father,ne,离散数学,U433730,析取范式
From: https://www.cnblogs.com/acidbarium/p/18206978

相关文章

  • 离散数学_集合运算_容器实现
    define_CRT_SECURE_NO_WARNINGS1/*1.求任意两个集合的交集、并集、差集2.求任意一个集合的幂集3.求任意一个集合的m元子集*/includeincludeincludeincludeusingnamespacestd;//检验一个元素是否已经存在于集合中boolexisted(vectors,chara){boolexist=fa......
  • 24数媒Java上机2
    对于一个包含N个非负整数的数组A[0..n-1],如果有0<=i<j<n,且A[i]>A[j],则称(A[i],A[j])为数组A中的一个逆序对。现给定一组数,请你算出这组数中共有多少组逆序对。输入格式:共两行,第一行是一个整数N(N≤1000),表示这组数的个数。第二行有N个整数,用空格分隔,为这组数。测试......
  • 离散数学笔记——集合
    离散数学笔记——集合集合的概念集合是由一些确定的元素所组成的整体,其中的元素可以是任何事物定义:A={a1,a2,a3,...,an}表示集合的名称,{}表示集合的符号。a1,a2,a3,...an表示集合中的元素x∈A表示元素x属于集合A集合的特点集合没有重复元素集合......
  • 《计算机网络与数据库技术》-上机实验六
    一.【实验目的】(1)掌握变量的使用方法。(2)掌握函数的使用方法。(3)掌握Transact-SQL编程二、【实验准备】(1)已经接入局域网的网络实验室。(2)机器上已安装SQLServer。三.【实验内容】(1)用Transact-SQL编程:先为两个变量@x和@y赋值,然后求这两个变量的......
  • (未完成)离散数学
    命题具有唯一真值的陈述句,具有客观性质。任何疑问句、祈使句、感叹句、有歧义的陈述句不属于命题。真值为“真”的命题是真命题,真值为“假”的命题是假命题。命题的分类:原子命题:不可再分解的命题(用大写英文字母P,Q,R……表示<可以有下标>)。复合命题:可再分解的命题,由原子命......
  • 离散数学:“张三李四王五说谎问题”
    在大一下期的离散课程里,通过王建芳教授的指导,使我真正了解并体会到了离散的数学之美。下面开始进行问题与解答的分享:谁在说谎?①张三说李四在说谎。②李四说王五在说谎。③王五说张三、李四都在说谎。请问三人中到底谁在说谎?这是通过真值表的方法来判断到底是谁在说谎,但......
  • 微机原理上机实验记录
    eg0202.asm;eg0202.asmincludeio32.inc.datacountdword12345678h,9abcdef0h,0,0,3721h.codestart:moveax,33221100hmovebx,eaxmovecx,countmovebx,offsetcountmovedx,[ebx]movesi,[ebx+4]movesi,4movedi,count[esi]movedi,[ebx+esi]movecx,[eb......
  • 【离散数学-学习日记】2024-3-23
    有向欧拉图的判别法【定理4-3】有向图D是欧拉图当且仅当D是强连通的且每个顶点的入度都等于出度。【定理4-4】有向图D是半欧拉图当且仅当D是单向连通的,且D中恰好有两个奇度顶点,其中一个的入度比出度大1,另一个的出度比入度大1,而其余顶点的入度都等于出度。【定理4-5】G是......
  • NOJ南邮上机 矩阵变换问题 PROB1020 Python
    PROB1020   矩阵变换问题描述:给定一个 n×m的矩阵,对于 初始矩阵 中所有值为 1 的元素,重置其 所在行列 的所有元素为 0,最后输出整个修改后的矩阵。输入:输入共包含 1+n行。第一行包两个整数 n 和 m,分别表示矩阵的长和宽,题目保证 2≤n,m≤700且 4≤n×m......
  • NOJ南邮上机 最大公约数和最小公倍数 PROB1006 Python
    PROB1006  最大公约数和最小公倍数描述:求两个正整数的最大公约数和最小公倍数输入:两个正整数A,B输出:两个正整数的最大公约数、最小公倍数样例输入:43样例输出:112defmax_gcd(a,b):whileb!=0:temp=a%ba=bb=temp......