2024年6月16日 星期日

o077. 2. 電子畫布

題目描述:

有一個 H ╳ W 的電子畫布,一開始數值都是 0 代表未填色,接下來請模擬 N 次畫筆操作。

每次畫筆操作為選一個座標 (r,c) 停留 t 秒,他會將曼哈頓距離 <= t 的區塊染上顏色 x。若有多個顏色重複填到相同區塊,顏色的數值會累加起來。

請輸出 N 次操作後的畫布狀態。


這題簡單來說就是要想個找出距中心點等距的菱形座標。

我思考的方式很簡單,首先找到中心點,並根據該點的資料找出他離他最遠單的Y座標端點。
得到,以下這個迴圈。

for y in range(r-t,r+t+1):

注意一下,菱形的關鍵就是從中心點到任一端點都是等距,所以我們先把中心點座標取這次拿到的Y座標算出差距得到:

ydif = abs(r-y)#ydif就是中心點與這次y座標的差距

已知ydif+xdif=t,現在t跟ydif都是已知,所以xdif = t-abs(ydif),所以就可以得出下面這個迴圈:

for x in range(c-(t-ydif) , c+(t-ydif)+1):

菱形矩陣搞定後,這題就沒有其他問題囉,以下是完整程式。


def t():
    h,w,n = [int(i) for i in input().split()]
    tt = [[0 for i in range(w)] for j in range(h)]
    
    
    for j in range(n):
        r,c,t,q = [int(i) for i in input().split()]
        for y in range(r-t,r+t+1):
            if y < 0 or y > h-1: 
                continue
            ydif = abs(r-y)
            for x in range(c-(t-ydif) , c+(t-ydif)+1):
                if x < 0 or x > w-1:
                    continue
                tt[y][x] += q
    for i in tt:
        for j in i:
           print(j , end = ' ')
        print()
t()

沒有留言:

張貼留言

o079. 4. 最佳選擇

 題目描述: 給一個長度為 n 的正整數序列 a1,a2...an ,你可以執行多次操作 (包含 0 次),每次操作只能選擇這個序列的第一個或最後一個數字,再將這個數字從序列中刪除並自己搜集起來。 求滿足總和不超過 k 且搜集的數字奇數和偶數個數相同的條件下,所能搜集的數字總和最...