熱門文章

2025年7月21日 星期一

ZeroJudge 解題筆記:b367. 翻轉世界

作者:王一哲
日期: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;
}


沒有留言:

張貼留言