日期:2025年7月21日
ZeroJudge 題目連結:b367. 翻轉世界
解題想法
可以用二維串列儲存圖的內容,再從上下兩端逐行檢查,下方的列前後順序對調之後內容是否與上方的列相同;如果共有奇數列,還要再單獨檢查中間的列。也可以將圖的內容接成很長的一維串列,只要從兩端往中間依序檢查數字是否相同,寫起來比較簡單。
Python 程式碼
用二維串列儲存圖的內容,使用時間約為 18 ms,記憶體約為 3.3 MB,通過測試。
def check(grid): # 輸入圖,判斷是否轉 180 度之後對稱
n, m = len(grid), len(grid[0]) # 圖的尺寸
for i in range(n//2): # 從上下兩端往中間檢查
if grid[i] != grid[n-i-1][::-1]: # 如果將底下的列翻轉之後不相等
return False # 回傳 False
if n%2 == 1: # 如果為奇數列,再檢查中間的列
if grid[n//2] != grid[n//2][::-1]:
return False
return True # 最後回傳 True
t = int(input()) # t 張圖
for _ in range(t): # 執行 t 次
n, m = map(int, input().split()) # 圖的尺寸 n*m
grid = [list(map(int, input().split())) for _ in range(n)] # 讀取圖
print("go forward" if check(grid) else "keep defending")
將圖的內容接成很長的一維串列,使用時間約為 20 ms,記憶體約為 3.3 MB,通過測試。
def check(grid): # 輸入圖,判斷是否轉 180 度之後對稱
n = len(grid)
for i in range(n//2): # 從兩端往中間檢查
if grid[i] != grid[n-i-1]: # 如果不相等
return False # 回傳 False
return True # 最後回傳 True
t = int(input()) # t 張圖
for _ in range(t): # 執行 t 次
n, m = map(int, input().split()) # 圖的尺寸 n*m
grid = [] # 讀取圖,轉成一維
for _ in range(n):
grid += list(map(int, input().split()))
print("go forward" if check(grid) else "keep defending")
C++ 程式碼
用二維陣列儲存圖的內容,使用時間約為 2 ms,記憶體約為 288 kB,通過測試。
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
bool check(vector<vector<int>>& grid) { // 輸入圖,判斷是否轉 180 度之後對稱
int n = (int)grid.size(), m = (int)grid[0].size(); // 圖的尺寸
for(int i=0; i<n/2; i++) { // 從上下兩端往中間檢查
vector<int> row (grid[n-i-1].crbegin(), grid[n-i-1].crend());
if (grid[i] != row) { // 如果將底下的列翻轉之後不相等
return false; // 回傳 False
}
}
if (n%2 == 1) { // 如果為奇數列,再檢查中間的列
for(int i=0; i<m/2; i++) {
if (grid[n/2][i] != grid[n/2][m-i-1]) {
return false;
}
}
}
return true; // 最後回傳 True
}
int main() {
int t; scanf("%d", &t); // t 張圖
while(t--) { // 執行 t 次
int n, m; scanf("%d %d", &n, &m); // 圖的尺寸 n*m
vector<vector<int>> grid (n, vector<int> (m)); // 讀取圖
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
scanf("%d", &grid[i][j]);
}
}
if (check(grid)) puts("go forward");
else puts("keep defending");
}
return 0;
}
將圖的內容接成很長的一維陣列,使用時間約為 2 ms,記憶體約為 280 kB,通過測試。
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
bool check(vector<int>& grid) { // 輸入圖,判斷是否轉 180 度之後對稱
int n = (int)grid.size(); // 圖的尺寸
for(int i=0; i<n/2; i++) { // 從兩端往中間檢查
if (grid[i] != grid[n-i-1]) return false;
}
return true; // 最後回傳 True
}
int main() {
int t; scanf("%d", &t); // t 張圖
while(t--) { // 執行 t 次
int n, m; scanf("%d %d", &n, &m); // 圖的尺寸 n*m
vector<int> grid (n*m); // 讀取圖
for(int i=0; i<n*m; i++) scanf("%d", &grid[i]);
if (check(grid)) puts("go forward");
else puts("keep defending");
}
return 0;
}
沒有留言:
張貼留言