用C语言编写题目3:闭包运算 问题描述 对于给定的集合以及二元关系,计算其自反、对称、传递闭包 输入格式 第一行输入一个集合的元素,用”,”分隔 第二行输入一个的二元关系,用”;”分隔 第三行输入运算闭包关系的类型(r,s,t) 输出格式 输出对应的0-1关系矩阵 样例输入: 样例1 a,b,c ab;bc;ca r 样例2 a,b,c, ab;bc;ca; s 样例输出 样例1 1 1 0 0 1 1 1 0 1 样例2 0 1 1 1 0 1 1 1 0
时间: 2024-03-10 20:51:12 浏览: 15
```c
#include <stdio.h>
#include <string.h>
#define MAXN 100
int main() {
char set[MAXN], relation[MAXN * MAXN], type;
int n = 0, m = 0, closure[MAXN][MAXN] = {0};
scanf("%[^'\n']%*c", set);
scanf("%[^'\n']%*c", relation);
scanf("%c", &type);
// 处理集合元素
for (int i = 0; set[i]; i++) {
if (set[i] != ',') {
closure[i][i] = 1;
n++;
}
}
// 处理二元关系
for (int i = 0; relation[i]; i++) {
if (relation[i] == ';') continue;
int u = relation[i] - 'a', v = relation[i + 1] - 'a';
closure[u][v] = 1;
m++;
i++;
}
// 计算闭包
if (type == 'r') { // 计算自反闭包
for (int i = 0; i < n; i++) {
if (!closure[i][i]) {
closure[i][i] = 1;
m++;
}
}
} else if (type == 's') { // 计算对称闭包
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
if (closure[i][j] && !closure[j][i]) {
closure[j][i] = 1;
m++;
} else if (!closure[i][j] && closure[j][i]) {
closure[i][j] = 1;
m++;
}
}
}
} else { // 计算传递闭包
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!closure[i][j] && closure[i][k] && closure[k][j]) {
closure[i][j] = 1;
m++;
}
}
}
}
}
// 输出结果
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", closure[i][j]);
}
printf("\n");
}
return 0;
}
```