集合論プログラミング演習 | C++ | 離散数学

トピック 1. 関係の推移的な終結を求める

入力

関係行列を一度に入力し、各行の隣接する 2 つの要素はスペースで区切り、入力要素の行と列はそれぞれ関係行列の行と列に対応します。リレーションシップのカーディナリティは 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秒 64M 0

-> この質問は 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;  
}  

トピック 2. 部分順序集合の最大要素と最小要素を見つける

入力

半順序集合 <A, ≤> を入力. A の要素数は 20 を超えず、英小文字 1 文字で表されます。

入力の最初の行は、2 つの隣接する要素をコンマで区切って、A の個々の要素を示します。

入力の 2 行目は、<a,b>,< c のように、半順序関係 ≤ を順序対の形式で与えます (ハース図のカバレッジを満たす 2 つの要素によって形成される順序対のみが与えられます)。 、a> など、隣接する 2 つの順序付きペアはコンマで区切られます。

出力

A の最小要素と最大要素を出力します。

出力の最初の行は、各最小要素を示し、隣接する 2 つの要素はコンマで区切られます.出力要素は、英字の自然な順序で配置する必要があります.

出力の 2 行目は各最大要素を示し、隣接する 2 つの要素はカンマで区切られ、出力要素は英字の自然な順序で出力する必要があります。

テスト入力 期待される出力 制限時間 メモリ制限 余分なプロセス
テスト ケース 1 テキストとして表示
  1. a,b,c,d↵
  2. <a,b>,<c,d>↵
テキストとして表示
  1. a,c↵
  2. b,d↵
1秒 64M 0

各要素について、そのプレフィックスとサフィックスを数えます。プレフィックス番号が 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;  
}  

 これらの 2 つの質問は非常に簡単です。時間を無駄にしないでください。

おすすめ

転載: blog.csdn.net/m0_70241024/article/details/127701093