离散数学编程作业

一:真值表的打印

要求:输入任意主析取范式或者主合取范式打印出真值表

#include <iostream>
#include <stack>
#include <map>
#include <cstdio>
#include <algorithm>
using namespace std;
stack<int> num;
stack<int> fuhao;
int n;
map<char,int> mp;
string str;
int w[100];
char temp[100];

/**输入格式
p-(q-r)
r-(p-(p-q))
~p|~q

**/

void calu_num()
{
    int len = str.length();
    int flag[200] = {0};
    for(int i = 0; i < len; i++)
    {
        if(str[i] >= ‘a‘ && str[i] <= ‘z‘)
        {
            if(!flag[str[i]])
            {
                temp[n++] = str[i];
                flag[str[i]] = 1;
            }
        }
    }
    sort(temp,temp+n,greater<char>() );
    for(int i = 0; i < n; i++)  mp[temp[i]] = i + 1;
    mp[1] = n+1;
    mp[0] = n+2;

}
void  push()
{
    char ch1,ch2,ch3;
    ch1 = num.top();
    num.pop();
    ch2 = num.top();
    num.pop();
    ch3 = fuhao.top();
    fuhao.pop();
    if(ch3 == ‘&‘)
    {
        num.push( (ch2 >= ‘A‘ && ch2 <= ‘Z‘ ? !w[mp[ch2 + 32]] : w[mp[ch2]] ) &
                  (ch1 >= ‘A‘ && ch1 <= ‘Z‘ ? !w[mp[ch1+32]] : w[mp[ch1]]  ) );
    }
    else if(ch3 == ‘|‘)
    {
        num.push( (ch2 >= ‘A‘ && ch2 <= ‘Z‘ ? !w[mp[ch2 + 32]] : w[mp[ch2]] ) ||
                  (ch1 >= ‘A‘ && ch1 <= ‘Z‘ ? !w[mp[ch1+32]] : w[mp[ch1]]  ) );
    }
    else if(ch3 == ‘-‘)
    {
        num.push( (ch2 >= ‘A‘ && ch2 <= ‘Z‘ ? w[mp[ch2 + 32]] : !w[mp[ch2]] ) ||
                  (ch1 >= ‘A‘ && ch1 <= ‘Z‘ ? !w[mp[ch1 + 32]] : w[mp[ch1]]  ) );
    }
}

int solve1()
{
    int len = str.length();
    while(!num.empty()) num.pop();
    while(!fuhao.empty()) fuhao.pop();
    for(int i = 0; i < len; i++)
    {
        if(str[i] == ‘(‘ ) continue;
        if(str[i] == ‘)‘ && num.size() > 1 && fuhao.size() >= 1)
        {
            push();
            continue;
        }
        if(str[i] >= ‘a‘ && str[i] <= ‘z‘)
        {
            num.push(str[i]);
        }
        else
        {
            if(str[i] == ‘~‘)
            {
                i++;
                num.push(str[i] - 32);
            }
            else fuhao.push(str[i]);
        }

    }
    if(num.size() > 1 && fuhao.size() >= 1)
    {
        push();
    }
    return (int)num.top();
}

void solve()
{
    calu_num();
    for(int j = n-1; j >= 0; j--)   cout<<temp[j]<<"  ";
    for(int i = 0; i < str.length(); i++)
    {
        cout<<str[i];
        if(str[i] == ‘-‘) cout<<">";
    }
    cout<<" "<<endl;
    for(int i = 0; i <= (1 << n) - 1; i++)
    {
        for(int j = 1; j <= n; j++)  w[j] =  1 & (i >> (j - 1) ) ;
        w[n+1] = 1;
        w[n+2] = 0;
        int ans = solve1();
        for(int j = n; j >= 1; j--)  cout<<w[j]<<"  ";
        cout<<ans<<endl;
    }
}

int main()
{
#ifdef xxz
    freopen("in.txt","r",stdin);
#endif // xxz
    cout<<"请输入字符串,支持吸取(&),合取(|),蕴含(-),非(~):"<<endl<<endl;
    cin>>str;
    solve();
    return 0;
}

二:用消解法判断公式是否是可满足的(默认已经是主合取范式)

#include <iostream>
#include <set>
#include <cstring>
#include <cstdio>
using namespace std;
set<string> s0;
set<string> s1;
set<string> s2;
string str,temp;

/**
输入格式,默认已经是合取范式
(~p|q)&(p|q)&(~q)
p&(p|q)&(p|~q)&(q|~r)&(p|r)
**/

void init()
{
    s0.clear();
    s1.clear();
    s2.clear();

    int p = 0;
    for(int i = 0; i < str.length(); i++)
    {
        if(i == 0 && str[i] != ‘(‘)
        {
            temp.clear();
            temp += str[i];
            s1.insert(temp);
            continue;
        }
        if(str[i] == ‘&‘ && str[i+1] != ‘(‘)
        {
            temp.clear();
            temp += str[i+1];
            s1.insert(temp);
            continue;
        }
        if(str[i] == ‘(‘) p = i;
        if(str[i] == ‘)‘)
        {
            temp.clear();
            for(int j = p+1; j < i; j++)
            {
                if(str[j] == ‘~‘)
                {
                    str[j+1] = str[j+1] - 32;
                    temp += str[j+1];
                    j++;
                }
                else if(str[j] != ‘|‘)
                {
                    temp += str[j];
                }

            }
            s1.insert(temp);
        }

    }

}

string Res(string A, string B)
{
    int Count[26] = {0};
    int id;

    for(int i = 0; i < A.size(); i++)
    {
        if(A[i] < ‘a‘)
        {
            id = A[i] - ‘A‘;
            Count[id]++;
        }
        else
        {
            id = A[i] - ‘a‘;
            Count[id]--;
        }
    }
    for(int i = 0; i < B.size(); i++)
    {
        if(B[i] < ‘a‘)
        {
            id = B[i] - ‘A‘;
            Count[id]++;
        }
        else
        {
            id = B[i] - ‘a‘;
            Count[id]--;
        }
    }

    string C;

    for(int i = 0; i < 26; i++)
    {
        if(Count[i] > 0) C += i + ‘A‘;
        if(Count[i] < 0) C += i + ‘a‘;
    }

    return C;
}

bool solve()
{
    set<string>::iterator it,iy;
    while(true)
    {

        //遍历s0,s1
        for(it = s0.begin(); it != s0.end(); it++)
            for(iy = s1.begin() ; iy != s1.end(); iy++)
            {
                string t1 = *it,t2 = *iy;
                string C = Res(t1,t2);
                if(C.empty()) return false;
                else if(s0.count(C) == 0 && s1.count(C) == 0)
                {
                    s2.insert(C);
                }
            }

        //遍历s1
        for(it = s1.begin(); it != s1.end(); it++)
        {
            for(iy = ++it,it--; iy != s1.end(); iy++)
            {
                string t1 = *it,t2 = *iy;
                string C = Res(t1,t2);
                if(C.empty()) return false;
                else if(s0.count(C) == 0 && s1.count(C) == 0)  s2.insert(C);

            }

        }

        if(s2.empty()) return true;
        else
        {
            s0 = s1;
            s1 = s2;
            s2.clear();
        }
    }
}

int main()
{
#ifdef xxz
    freopen("in.txt","r",stdin);
#endif // xxz
    while(cin>>str)
    {
        init();
        if(solve()) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-25 19:17:47

离散数学编程作业的相关文章

Stanford coursera Andrew Ng 机器学习课程编程作业(Exercise 2)及总结

Exercise 1:Linear Regression---实现一个线性回归 关于如何实现一个线性回归,请参考:http://www.cnblogs.com/hapjin/p/6079012.html Exercise 2:Logistic Regression---实现一个逻辑回归 问题描述:用逻辑回归根据学生的考试成绩来判断该学生是否可以入学. 这里的训练数据(training instance)是学生的两次考试成绩,以及TA是否能够入学的决定(y=0表示成绩不合格,不予录取:y=1表示录

结对编程作业

这是第一次尝试结对编程,在本次结对编程作业中为了更好地体会它的好处和特点,我和我的搭档分别扮演了驾驶员和领航者的角色. 作为驾驶员:在我编程的过程中,出现了一些小问题,比如忘加分号,这些小问题可以及时的发现.有时我也会问我的领航者一些疑问,省去了上网查资料的过程,提高了编程的效率.在代码复审的过程中,有的问题我在自己调试的时候没有发现.比如输入某些数据的时候,离黄金点最近的玩家得0分.还有程序的功能上的一些缺陷,也被进一步完善.编程的时候我们会有一些交流,交流使我们互相更加了解对方的编程风格,在

Coursera公开课-Machine_learing:编程作业2

第三周编程作业:Logistic Regression 代码包在gitlab上:https://gitlab.com/luntai/Machine_Learning

ufldl学习笔记与编程作业:Softmax Regression(vectorization加速)

ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl. 于是最近就开始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节是对ufldl学习笔记与编程作业:Softmax Regression(softmax回归)版本的改进. 哈哈,把向量化的写法给写出来了,尼玛好快啊.只需要2分钟,2

Coursera公开课-Machine_learing:编程作业8(2016-10-06 20:49)

Anomaly Detection and Recommender Systems 本周编程作业分为两部分:异常检测和推荐系统. 异常检测:本质就是使用样本的到特种值的gaussian分布,来预估正确的特征值的范围.对于一些特殊情况可以使用,多元高斯分布. 要注意该方法与监督学习的不同的适用性特征. 推荐系统:本例程中使用了,预测用户对不同类型的电影评分来给用户推荐电影. 代码在gitlab.

ufldl学习笔记与编程作业:Logistic Regression(逻辑回归)

ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl. 于是最近就开始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节学习链接:http://ufldl.stanford.edu/tutorial/supervised/LogisticRegression/ 有了线性回归的基础再来学

2016福州大学软件工程第二次结对编程作业成绩

在这里跟大家道个歉,由于国庆节基本都在参加婚礼的路上所以现在才把成绩统计汇总了一下,份子钱太吓人已经把不多的工资吃掉了,这个月要靠泡面度日了.你们可是要好好学习,好好赚钱,好出的起同学的份子钱啊.扯远了,第二次结对编程成绩统计如下: 学号 第二次结对编程 031402233 9.5 031402224 9.5 031402330 9.5 031402516 9 031402524 9 031402304 9 031402509 9 031402341 9 031402508 9 03140232

ufldl学习笔记和编程作业:Softmax Regression(softmax回报)

ufldl学习笔记与编程作业:Softmax Regression(softmax回归) ufldl出了新教程.感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其它机器学习的算法,能够直接来学dl. 于是近期就開始搞这个了.教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节学习链接:http://ufldl.stanford.edu/tutoria

ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)

ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl. 于是最近就开始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节学习地址:http://ufldl.stanfor