判断是否构成群
给定一个运算表,判断它是否构成群
群定义:群表示一个拥有满足封闭性、满足结合律、有单位元、有逆元的二元运算的代数结构
输入
- 第一行是一个正整数m,表示运算表的个数
- 接下来是m个运算表。每个运算表的第一行是集合的元素个数n,集合元素用小写字母a,b,c,…表示,例如,n=3时,元素分别为a,b,c
- 每个运算表用多个串表示,例如,n=3的一个运算表:
abc
bca
cab
表示运算表:
输出
对于每个运算表,按照以下格式打印输出该运算表以及是否构成群:
a b c
b c a
c a b
Group:Yes/No
注意,
- 运算表中每个字母后留一个空格
- 如果构成群,则打印
Group:Yes
否则打印
Group:No
输入样例
2
3
abc
bca
cab
3
abc
acb
bca
输出样例
a b c
b c a
c a b
Group:Yes
a b c
a c b
b c a
Group:No
代码实现
#include <stdio.h>
int main(){
int matrixnum = 0;
scanf("%d",&matrixnum);
for(int i = 0; i < matrixnum; i++){
int size;//矩阵大小
int flag = 1;
scanf("%d",&size);
char matrix[10][10];
for(int j = 0; j < size; j++){
scanf("%s",matrix[j]);
}
for(int j = 0; j < size; j++){
for(int k = 0; k < size; k ++){
printf("%c ",matrix[j][k]);
//判断封闭性
if(matrix[j][k]>'a'+size-1)flag = 0;
}
putchar('\n');
}
//判断结合律
for(int j = 0; j < size; j++){
for(int k = 0; k < size; k ++){
for(int i = 0; i < size; i++){
if(matrix[matrix[j][k]-'a'][i]!=matrix[j][matrix[k][i]-'a'])flag = 0;
}
}
}
//判断单位元
int hasidentity = 0;
int identity =0;
for(int j = 0; j < size; j++){
int cnt = 0;
for(int k = 0; k < size; k ++){
if(matrix[j][k] == k+'a' && matrix[k][j] == k+'a')cnt++;
}
if(cnt == size){
hasidentity = 1;
identity = j;
}
}
if(hasidentity == 0)flag = 0;
//判断逆元
int arr[size] = {0};
for(int j = 0; j < size; j ++){
for(int k = 0; k < size; k++){
if(matrix[j][k] == j+'a' )arr[j]=1;
}
}
for(int j = 0; j < size; j++){
if(arr[j]==0)flag = 0;
}
if(flag == 1)printf("Group:Yes\n");
else printf("Group:No\n");
}
}