置頂

我的 VPython 教學文件 (HackMD 版本)

VPython 教學文件目錄 安裝及測試 基本語法 等速度直線運動 自由落下 終端速度 水平抛射 使用For迴圈計算水平抛射資料 斜向抛射 圓周運動 簡諧運動 單擺 木塊彈簧系統分離 重力及簡諧 行星運動 相疊木塊 雙重簡諧運動 一維彈性碰撞 ...

熱門文章

2026年10月14日 星期三

ZeroJudge 解題筆記:p929.像素圖 (Pixel)

作者:王一哲
日期:2026年10月14日


ZeroJudge 題目連結:p929.像素圖 (Pixel)

題目 pdf 檔連結:像素圖 (Pixel)

解題想法


題目是多筆測資。每筆測資第一列是 4 個整數 $n, m, p, q$,分別代表圖的尺寸為 $n \times m$,列擴長為 $p$ 倍,欄擴張為 $q$ 倍。接下來 $n$ 列每列有 $m$ 個 0 或 1,輸出擴張後的圖。先用兩層 for 迴圈依序讀取每一個數字,將擴張後長度變為 $m \times q$ 的一列內容先填好,再將擴張後的列重複印出 $p$ 次,這樣寫起來比較簡單。

Python 程式碼


使用時間約為 13 ms,記憶體約為 9.6 MB,通過測試。
def solve():
    import sys

    result = []
    data = sys.stdin.read().split()
    ptr = 0
    while ptr < len(data):
        n, m, p, q = map(int, data[ptr : ptr + 4])
        ptr += 4
        for i in range(n):
            row = [0] * (m*q)
            for j in range(m):
                v = int(data[ptr])
                ptr += 1
                #for k in range(q):
                #    row[j*q + k] = v
                row[j*q : (j+1)*q] = [v]*q  # 用串列切片填入資料
            res = " ".join(map(str, row)) + "\n"
            for _ in range(p):
                result.append(res)
    
    # 輸出答案
    sys.stdout.write("".join(result))

if __name__ == "__main__":
    solve()


C++ 程式碼


使用時間約為 1 ms,記憶體約為 3.6 MB,通過測試。
#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n, m, p, q;
    while(cin >> n >> m >> p >> q) {
        for(int i = 0; i < n; i++) {
            string res;
            for(int j = 0; j < m; j++) {
                int v;
                cin >> v;
                string t = to_string(v) + " ";
                for(int k = 0; k < q; k++) {
                    res += t;
                }
            }
            res.pop_back();
            for(int j = 0; j < p; j++) {
                cout << res << "\n";
            }
        }
    }
    return 0;
}


C 語言程式碼


使用時間約為 1 ms,記憶體約為 1.6 MB,通過測試。
#include <stdio.h>

int main() {
    int n, m, p, q;
    while(scanf("%d %d %d %d", &n, &m, &p, &q) != EOF) {
        for(int i = 0; i < n; i++) {
            int row[100];  // 擴張後的列,長度最多 100 
            for(int j = 0; j < m; j++) {
                int v;  // 值
                scanf("%d", &v);
                for(int k = 0; k < q; k++) {
                    row[j*q + k] = v;
                }
            }
            for(int j = 0; j < p; j++) {  // 印出 row p 次
                for(int k = 0; k < m*q; k++) {
                    printf("%d", row[k]);
                    if (k == m*q - 1) printf("\n");
                    else printf(" ");
                }
            }
        }
    }
    return 0;
}

沒有留言:

張貼留言