給定一個運算表,判斷它是否構成群
群定義:群表示一個擁有滿足封閉性、滿足結合律、有單位元、有逆元的二元運算的代數結構
輸入
- 第一行是一個正整數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");
}
}