前往
大廳
主題

ZeroJudge - f985: 攗皥蒽快給我去工作!!! 解題心得

Not In My Back Yard | 2021-07-28 00:00:07 | 巴幣 0 | 人氣 223

題目連結:


題目大意:
輸入有多筆測試資料。每筆測資第一列給定一列「A:」,接著三列每列給定三個整數,代表矩陣 A 這個 3 × 3 矩陣各位置之值;接著給定一列「C:」,再接著三列每列給定三個整數,代表矩陣 C 這個 3 × 3 矩陣各位置之值。其中 A 、 C 各位置的值位於 -1000 ~ 1000 這個範圍中。

請求出式子 A × B = C 中的 3 × 3 矩陣 B 之值(保證存在唯一一個矩陣 B)。輸出時請將每一項四捨五入至小數點後第四位。輸出格式參見範例輸出。



範例輸入:
A:
2 6 7
2 2 -10
-10 -10 4
C:
7 -1 -1
0 -10 -10
2 -10 -3
A:
-3 -10 -1
10 4 4
-10 8 -4
C:
-10 -10 -10
-10 -10 -10
-8 7 2
A:
-10 -1 -10
-5 -1 5
-10 -4 -4
C:
-10 -10 -10
-1 5 1
-7 -4 -10


範例輸出:
B:
-2.1522 4.8152 3.4076
1.9348 -3.2935 -2.6467
-0.0435 1.3043 1.1522
B:
52.0000 29.5000 37.0000
-1.5000 -0.2500 -0.6667
-131.0000 -76.0000 -94.3333
B:
0.6333 0.0000 0.2000
-0.2222 0.0000 1.3333
0.3889 1.0000 0.6667


解題思維:
因為 A × B = C ,再加上題目保證有解。因此可得 B = A ^ (-1) × C。

因此我們需要求得 A 的逆矩陣(Inverse Matrix)。可以用高斯消去法求得(參見維基),或是像我一樣直接爆開 3 × 3 的伴隨矩陣(Adjugate Matrix)以及行列式值(Determinant):
A*[0][0] = +(A[1][1] × A[2][2] - A[2][1] × A[1][2])
A*[0][1] = -(A[0][1] × A[2][2] - A[2][1] × A[0][2])
A*[0][2] = +(A[0][1] × A[1][2] - A[1][1] × A[0][2])
A*[1][0] = -(A[1][0] × A[2][2] - A[2][0] × A[1][2])
A*[1][1] = +(A[0][0] × A[2][2] - A[2][0] × A[0][2])
A*[1][2] = -(A[0][0] × A[1][2] - A[1][0] × A[0][2])
A*[2][0] = +(A[1][0] × A[2][1] - A[2][0] × A[1][1])
A*[2][1] = -(A[0][0] × A[2][1] - A[2][0] × A[0][1])
A*[2][2] = +(A[0][0] × A[1][1] - A[1][0] × A[0][1])
而 d 為 A 的行列式值,其值為
+ A[0][0] × (A[1][1] × A[2][2] - A[2][1] × A[1][2])
- A[0][1] × (A[1][0] × A[2][2] - A[2][0] × A[1][2])
+ A[0][2] × (A[1][0] × A[2][1] - A[2][0] × A[1][1])
因此 A 的逆矩陣 A ^ (-1) 即為將 A* 每一項除以 d 即可得到(當然對於一般的矩陣的逆矩陣的求法固然不能暴力展開,僅僅適用於本題這種大小很小的矩陣)。

求得 A ^ (-1) 後,做一次矩陣乘法即可求出 A ^ (-1) × C,即為矩陣 B 的內容。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作