判断是否构成群

给定一个运算表,判断它是否构成群

群定义:表示一个拥有满足封闭性、满足结合律、有单位元、有逆元的二元运算的代数结构

输入

  • 第一行是一个正整数m,表示运算表的个数
  • 接下来是m个运算表。每个运算表的第一行是集合的元素个数n,集合元素用小写字母a,b,c,…表示,例如,n=3时,元素分别为a,b,c
  • 每个运算表用多个串表示,例如,n=3的一个运算表:
abc 
bca 
cab 

表示运算表: file

输出

对于每个运算表,按照以下格式打印输出该运算表以及是否构成群:

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");
	}
}
posted on 2020-06-07 13:23  玻璃晴朗诶  阅读(1733)  评论(0编辑  收藏  举报