UVa 11349 - Symmetric Matrix

( Tip: 點擊左上方的三橫槓選單按鈕,可以收起左側 Pdf 頁。)

Step 1. 題目概要

  • 題目的目標是要檢查給定的矩陣是否為對稱矩陣,例如,下面是一個3x3的對稱矩陣
    1 2 3
    2 4 5
    3 5 6
    在這個矩陣中,主對角線上的元素是1、4和6,主對角線上方和下方的元素分別是2、3和5。由於主對角線上方和下方的元素相等,所以這個矩陣是對稱矩陣。
  • 對稱矩陣是指矩陣的主對角線上方和下方的元素相等的特殊矩陣。具體來說,如果一個方陣的第i行第j列的元素等於第j行第i列的元素,則該矩陣是對稱矩陣。

Step 2. 解題思路

  • 程式的主要部分是一個while迴圈,根據輸入的測試案例數量(T)執行。在每個測試案例中,它會讀取一個字元n1、一個字元n2和一個整數size,然後宣告一個大小為size * size的長整數陣列table。
  • 接下來,程式使用for迴圈讀取size * size個數字並將它們存儲在table陣列中。
  • 接著,程式使用for迴圈檢查矩陣的對稱性。它以中間為對稱點,從最外圍的兩個數字開始比對,如果有任何數字不相等或小於0,就跳出迴圈。
  • 最後,程式根據for迴圈的中斷條件輸出結果。如果迴圈完成了所有元素的比對,表示矩陣對稱,輸出"Test #X: Symmetric.“;否則,輸出"Test #X: Non-symmetric.”。其中,X表示測試案例的編號,cases變數用於追蹤測試案例的編號,每次測試案例完成後自增。

將二維陣列視為一維陣列來看是一個重要的觀念,舉例:
5 0 9
3 2 3 相當於 5 0 9 3 2 3 9 0 5
9 0 5

陷阱:本題測資相當巨大,需要使用long long int才能確保數字裝得下。

Step 3. 範例輸入與輸出 - Sample Input and Output

1
2
3
4
5
6
7
8
9
2 
N = 3
5 1 3
2 0 2
3 1 5
N = 3
5 1 3
2 0 2
0 1 5
1
2
Test #1: Symmetric. 
Test #2: Non-symmetric.

Step 4. 參考程式碼 - Accepted Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);

int T,cases=1;
cin>>T;
while(T--) {
char n1,n2;
int size;
cin>>n1>>n2>>size;
long long int table[size*size];
int i;
for(i=0;i<size*size;i++) {
cin>>table[i];
}
//check
for(i=0;i<size*size;i++) { //因為會以中間為對稱點,所以從最外圍兩個數字開始往中間去比對
if(table[i]!=table[(size*size-1)-i]||table[i]<0) break; //若數字不一樣或是數字小於0就中斷
}
//output
if(i==size*size) {
//如果迴圈沒有被中斷就是對稱矩陣
cout<<"Test #"<<cases++<<": Symmetric."<<endl;
} else {
cout<<"Test #"<<cases++<<": Non-symmetric."<<endl;
}
}
return 0;
}