# 2025/10 APCS 實作題/中級題本
> 第一題就有難到,邏輯不難,難在要做的事太多了,容易亂掉,我在第一題就心態崩了,差一點完成,殊不知後面題目其實還比較簡單,有夠哭
# 1. 彗星撞擊
:::info
https://zerojudge.tw/ShowProblem?problemid=r488
:::
## 題目
你正在研究一個長 $R$ 寬 $C$ 的矩形區域,模擬恐龍棲息地與彗星撞擊事件。
初始地圖是 $R \times C$ 的網格(座標從 $0$ 開始編號,行座標範圍 $[0, R-1]$,列座標範圍 $[0, C-1]$),所有區域的初始地面高度均為 $D$。地圖上有 $K$ 隻清醒的恐龍,相同座標可能有多隻恐龍。
接著,地圖將經歷 $M$ 次彗星撞擊事件。每次撞擊由中心點$(a, b)$、撞擊邊長$S$ 和撞擊深度$d$ 定義。
撞擊規則:
影響範圍:
每次撞擊的影響範圍是以 $(a, b)$ 為中心的邊長 $S$ 正方形區域(需與地圖邊界取交集)。
暈眩與凹陷判定:
如果在撞擊的影響範圍內存在至少一隻清醒的恐龍:
範圍內所有清醒恐龍會變為暈眩狀態。本次撞擊不會對該範圍造成地面凹陷。
否則(影響範圍內沒有清醒恐龍):
影響範圍內所有區域的地面高度會減少$d$。地面高度可以為負數。
請計算經歷 $M$ 次撞擊後:地圖上最高的地面高度。地圖上最低的地面高度。保持清醒的恐龍區域數量。
## 輸入說明:
第一行包含三個整數 $R, C, D$。($1 \le R, C, D \le 100$)
第二行包含一個整數 $K$。($0 \le K \le 100$)
接下來 $K$ 行,每行包含兩個整數 $r_i, c_i$,代表恐龍的初始座標。($0 \le r_i < R, 0 \le c_i < C$)
接下來一行包含一個整數 $M$。($1 \le M \le 100$)
接下來 $M$ 行,每行包含四個整數 $a_j, b_j, S_j, d_j$,代表第 $j$ 次撞擊的參數。($0 \le a_j < R, 0 \le b_j < C, 1 \le S_j \le 19 \text{ 且 } S_j \text{ 為奇數}, 1 \le d_j \le 10$)
(60 分): $R = 1$
(40 分): 無限制
## 輸出說明:
輸出僅一行,包含三個整數,以空格分隔:
**最高地面高度 最低地面高度 清醒恐龍數量**
## 解題絲路
用兩個二維陣列儲存題目輸入的資訊,一個存高度,一個存恐龍位置。
每次發生撞擊事件都要做兩件事:
1. 此位置有沒有恐龍
2. 更動撞擊影響範圍
透過一個變數flag,如果發生撞擊事件,且此位置有恐龍,就把flag改成true,且跳過第二輪的更動(因為恐龍可以擋撞擊)
```cpp=
#include <bits/stdc++.h>
using namespace std;
#define io ios::sync_with_stdio(false);cin.tie(nullptr);
// 一個矩陣存高度,一個存恐龍位置
int mp_H[101][101] ={};
int mp_D[101][101] ={};
int main(){
io
int R,C,D,K,M;
cin >> R >> C >> D;
fill(&mp_H[0][0], &mp_H[0][0] + 101*101, D);
cin >> K;
for (int i=0;i<K;i++){
int r,c;
cin >> r >> c;
++mp_D[r][c];
}
cin >> M;
for (int j=0;j<M;j++){
int A,B,S,d;
bool flag = false;
cin >> A >> B >> S >> d;
int s = S/2;
for (int a=A-s;a<=A+s;++a){
for (int b=B-s;b<=B+s;++b){
if(a>=0 && a<R && b>=0 && b<C){
if(mp_D[a][b]){
flag=true;
break;
}
}
}
}
for (int a=A-s;a<=A+s;++a){
for (int b=B-s;b<=B+s;++b){
if(a>=0 && a<R && b>=0 && b<C){
mp_D[a][b]=0;
if (!flag){
mp_H[a][b]-=d;
}}
}
}
}
int ans=0;
int max_H=INT_MIN, min_H=INT_MAX;
for(int i=0;i<R;++i){
for(int j=0;j<C;++j){
max_H=max(max_H, mp_H[i][j]);
min_H=min(min_H, mp_H[i][j]);
ans+=mp_D[i][j];
}
}
cout<<max_H<<' '<<min_H<<' '<<ans<<'\n';
}
```
---
:::info
趁機宣傳一下我自己的個人網站跟Youtube頻道 !!
**[個人網站](https://hyc.eshachem.com/) | [Youtube頻道](https://www.youtube.com/@Hy.C)**
:::
@2025 Hy.C 陳毓
> Copyright ©Hy.C 陳毓 CC BY-NC-SA 4.0 | 禁止商業用途 | 轉載標記出處 | 改編作品必須在相同條款下分享。