集合论编程练习 | C++ | 离散数学

题目一、求关系的传递闭包

输入

一次输入一个关系矩阵,每一行两个相邻元素之间用一个空格隔开,输入元素的行与列分别对应关系矩阵的行与列。关系的基数小于12。

输出

输出该关系的传递闭包所对应的关系矩阵。

友情提示:可以使用while (scanf("%d",&a)!=EOF)

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 0 1 0 0↵
  2. 1 0 1 0↵
  3. 0 0 0 1↵
  4. 0 1 0 0↵
以文本方式显示
  1. 1 1 1 1↵
  2. 1 1 1 1↵
  3. 1 1 1 1↵
  4. 1 1 1 1↵
1秒64M0

-> 本题参考Warshell算法

#include<bits/stdc++.h>   
using namespace std;  
int Matrix[144];  
  
int main(){  
        
    int n=0, a;  
    while ( scanf("%d",&a)!=EOF ) {  
        Matrix[n] = a;  
        n++;  
    }  
    a = sqrt(n);  
      
    for(int k=0;k<a;k++){    
        for(int i=0;i<a;i++){   
            for(int j=0;j<a;j++){    
                if(Matrix[i*a+j]!=1)  
                    Matrix[i*a+j]=Matrix[i*a+k]&Matrix[k*a+j];  
            }  
        }  
    }  
    for (int i=0; i<a; i++) {  
        for (int j=0; j<a; j++) {  
            if (j==0) printf("%d",Matrix[i*a+j]);  
            else      printf(" %d",Matrix[i*a+j]);  
        }  
        printf("\n");  
    }  
       
    return 0;  
}  

题目二、求偏序集中的极大元与极小元

输入

输入偏序集<A, ≤>,A中的元素数不超过20个,分别用单个小写的英文字母表示。

输入的第一行给出A中的各个元素,两个相邻的元素之间用逗号隔开。

输入的第二行给出偏序关系≤,用有序对的形式给出(只给出哈斯图中的满足覆盖的两个元素形成的有序对),如<a,b>,<c,a>等等,两个相邻的有序对之间用逗号隔开。

输出

输出A的极小元与极大元。

输出的第一行给出各个极小元,两个相邻元素之间用逗号隔开,输出的元素要求按照英文字母的自然顺序排列输出。

输出的第二行给出各个极大元,两个相邻元素之间用逗号隔开,输出的元素要求按照英文字母的自然顺序排列输出。

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. a,b,c,d↵
  2. <a,b>,<c,d>↵
以文本方式显示
  1. a,c↵
  2. b,d↵
1秒64M0

对于每一个元素,统计它的前缀和后缀。如果它的前缀数是0,表明它是极小值;如果它的后缀数是0,表明它是极大值。

#include<bits/stdc++.h>   
using namespace std;  
struct ch {  
    char name;  
    int before=0, after=0;  
};  
ch character[20];  
int main(){  
       
    string str;  
    cin >> str;  
    for (int i=0; i<=str.length(); i+=2) {  
        character[i/2].name = str[i];  
    }  
    int n = (str.length()+1)/2;  
      
    cin >> str;  
    for (int i=0; i<=str.length(); i+=6) {  
        for (int j=0; j<n; j++) {  
            if (str[i+1]==character[j].name) {  
                character[j].after++;  
                break;  
            }  
        }  
        for (int j=0; j<n; j++) {  
            if (str[i+3]==character[j].name) {  
                character[j].before++;  
                break;  
            }  
        }  
    }  
      
    int k=0;  
    for (int i=0; i<n; i++) {  
        if (character[i].before==0) {  
            if (k==0) {  
                printf("%c",character[i].name);  
                k=1;  
            }  
            else {  
                printf(",%c",character[i].name);  
            }  
        }  
    }  
    printf("\n");  
      
    k=0;  
    for (int i=0; i<n; i++) {  
        if (character[i].after==0) {  
            if (k==0) {  
                printf("%c",character[i].name);  
                k=1;  
            }  
            else {  
                printf(",%c",character[i].name);  
            }  
        }  
    }  
    printf("\n");  
      
    return 0;  
}  

 这两题都很简单,不浪费时间了

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值