# Array# Input/Output# Conditional Statements

e513 - 11349 - Symmetric Matrix

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷給定的 n x n 矩陣是否為對稱矩陣。對稱矩陣的定義是所有元素都是非負的,並且關於矩陣中心對稱,即 a[i][j] == a[n-i-1][n-j-1] 對所有有效的 i 和 j 都成立。

解題思路

程式碼首先讀取測試案例的數量 t。對於每個測試案例,它讀取矩陣的維度 n,然後讀取矩陣的元素。在讀取元素時,程式會檢查是否有負數,如果有,則立即將答案設為 "Non-symmetric"。然後,程式會檢查矩陣是否關於中心對稱。它只檢查矩陣的上三角部分(包括對角線),因為如果上三角部分是對稱的,則整個矩陣是對稱的。如果找到任何不對稱的元素,則將答案設為 "Non-symmetric"。最後,程式輸出結果。

複雜度分析

  • 時間複雜度: O(n^2)
  • 空間複雜度: O(n^2)

程式碼

#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <stdio.h>
long long int a[101][101],n,t;
char c;
inline long long int read(){
	long long int a(0),f(1);
	char c('0');
	while(c>='0'||c=='-'){
		if(c=='-'){
			f=-1;
			c=getchar_unlocked();
		}
		a=a*10+c-'0';
		c=getchar_unlocked();
	}
	return a*f;
}
inline void write(int x) {
	int stk[4],*ptr(&stk[0]);
	while(x){*ptr=x%10;x/=10;++ptr;}
	while(--ptr>=(&stk[0])){putchar_unlocked(*ptr+'0');}
}
int main(){
	t=read();
	for(int ca=1;ca<=t;++ca){
		c=getchar_unlocked();
		c=getchar_unlocked();
		c=getchar_unlocked();
		c=getchar_unlocked();
		n=read();
		char ans=1;
		for(int i=0;i<n;++i)
			for(int j=0;j<n;++j){
				a[i][j]=read();
				if(a[i][j]<0)ans=0;
			}
		int nn=n/2+n%2;
		for(int i=0;i<nn&&ans;++i)
			for(int j=0;j<n&&ans;++j)
				if(a[i][j]!=a[n-i-1][n-j-1])
					ans=0;
		putchar_unlocked('T');
		putchar_unlocked('e');
		putchar_unlocked('s');
		putchar_unlocked('t');
		putchar_unlocked(' ');
		putchar_unlocked('#');
		write(ca);
		putchar_unlocked(':');
		putchar_unlocked(' ');
		if(ans)
			puts("Symmetric.");
		else
			puts("Non-symmetric.");
	}
}

Discussion