# APCS實作題2025年10月中級第2題:航空拍照圖
> 日期:2025年11月3日
> 作者:王一哲
> [ZeroJudge 題目連結](https://zerojudge.tw/ShowProblem?problemid=r489)
<br />
## 解題想法
這題不會有兩張照片尺寸不同的問題,不需要考慮這個特例。比對時兩張照片都可以旋轉,但是某些旋轉方式的效果相同,因此只需要檢查以下 4 種狀況:
1. 都不旋轉
2. A 轉 90 度,B 轉 270 度
3. B 轉 180 度
4. A 轉 270 度,B 轉 90 度
我是用兩層 for 迴圈掃過圖片的每一格,速度比較慢一點。
<br /><br />
## Python 程式碼
使用時間約為 56 ms,記憶體約為 3.8 MB,通過測試。
```python=
R, C = map(int, input().split()) # 照片尺寸 R*C
A = [list(map(int, input().split())) for _ in range(R)] # 照片 A
B = [list(map(int, input().split())) for _ in range(R)] # 照片 B
cnt = [0]*4 # 4 種旋轉角度時相同的格子數量
for i in range(R):
for j in range(C):
if A[i][j] == B[i][j]: # 都不旋轉
cnt[0] += 1
if A[i][j] == B[i][C-j-1]: # A 轉 90 度,B 轉 270 度
cnt[1] += 1
if A[i][j] == B[R-i-1][C-j-1]: # B 轉 180 度
cnt[2] += 1
if A[i][C-j-1] == B[i][j]: # A 轉 270 度,B 轉 90 度
cnt[3] += 1
# 找最大值並輸出答案
imax = max(cnt)
print(f"{100*imax//(R*C):d}%")
```
<br />
## C++ 程式碼
使用時間約為 9 ms,記憶體約為 612 kB,通過測試。
```cpp=
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int R, C; scanf("%d %d", &R, &C); // 照片尺寸 R*C
vector<vector<int>> A (R, vector<int> (C)), B (R, vector<int> (C));
for(int i=0; i<R; i++) {
for(int j=0; j<C; j++) {
scanf("%d", &A[i][j]);
}
}
for(int i=0; i<R; i++) {
for(int j=0; j<C; j++) {
scanf("%d", &B[i][j]);
}
}
vector<int> cnt (4, 0); // 4 種旋轉角度時相同的格子數量
for(int i=0; i<R; i++) {
for(int j=0; j<C; j++) {
if (A[i][j] == B[i][j]) cnt[0]++; // 都不旋轉
if (A[i][j] == B[i][C-j-1]) cnt[1]++; // A 轉 90 度,B 轉 270 度
if (A[i][j] == B[R-i-1][C-j-1]) cnt[2]++; // B 轉 180 度
if (A[i][C-j-1] == B[i][j]) cnt[3]++; // A 轉 270 度,B 轉 90 度
}
}
printf("%d%%\n", 100*(*max_element(cnt.begin(), cnt.end())) / (R*C));
return 0;
}
```
<br /><br />
---
###### tags:`APCS`、`C++`、`Python`