e513 - 11349 - Symmetric Matrix
題目描述
題目要求判斷給定的 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.");
}
}