输入格式:
输入关系矩阵的阶数n(n<=10),接着输入如具有关系R的元素下标(i,j),输入 -1 -1,结束输入。判断该二元关系具有的性质。
输出格式:
输出二元关系a的性质,如果具有自反性性,则显示“a is reflexive”,如果具有对称性,则显示“a is transitive”,如果具有传递性,则显示“a is transitive”,如果具有自反性、对称性、传递性,则显示具有等价性“a is equivalent”。如果输入的n大于10,或者输入的数组元素下标i,j大于等于n(数组元素的下标应小于n),则显示"error",并结束程序。注意每个显示前后无空格,末尾回车。
输入样例:
在这里给出一组输入。例如:
3
1 0 2 0 0 1 2 1 0 2 1 2 -1 -1
输出样例:
在这里给出相应的输出。例如:
a is symmetrical
#include <iostream>
using namespace std;
#define MAX 1000
bool flag_ref, flag_sym, flag_tra; //自反性、对称性、传递性
int a[MAX][MAX];
int n;
//自反性
void Reflexive() {
flag_ref = 1;
for (int i = 0; i < n; ++i) {
if (a[i][i] != 1) { //只要有一个对角线元素为 0:即不满足
flag_ref = 0;
break;
}
}
if (flag_ref) {
cout << "a is reflexive" << endl;
}
}
//对称性
void Symmetrical()
{
flag_sym = true;
for(int i = 0; i < n; i++)
{
for(int j = 0; j <n; j++)
{
if(a[i][j] !=a[j][i])
{
flag_sym = false;
}
}
}
if(flag_sym == true)
{
cout << "a is symmetrical" << endl;
}
}
//传递性
void Transitive() {
flag_tra = 1;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
for (int k = 0; k < n; ++k) {
if (a[i][j] && a[j][k] && !a[i][k]) { //前两个为 1,第三个为 0
flag_tra = 0;
break;
}
}
}
}
if (flag_tra) {
cout << "a is transitive" << endl;
}
}
int main() {
int i = 0;
int j = 0;
cin >> n ;
cin >> i >> j;
if(n>10){
cout<<"error";
return 0;
}
while (i != -1 && j != -1) {
if (i >= n || j >= n)
{
cout << "error";
return 0;
}
a[i][j] = 1;
cin >> i >> j;
}
Reflexive();
Symmetrical();
Transitive();
if (flag_ref && flag_sym && flag_tra) {
cout << "a is equivalent" << endl;
}
return 0;
}
先形成关系矩阵,如果是自反的,对角线上的矩阵为1,如果是对称的,则矩阵相对于对角线上对称。如果是传递的计算矩阵的自相乘,判断2次矩阵和元矩阵同位置元素是否同时为0或不为0