日期: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;
}
沒有留言:
張貼留言