有一個 H*W 的電子畫布,一開始數值都是 0 代表未填色,接下來請模擬 N 次畫筆操作。
每次畫筆操作為選一個座標 (R, C) 停留 T 秒,他會將曼哈頓距離 <= T 的區塊染上顏色 X。若有多個顏色重複填到相同區塊,顏色的數值會累加起來。
請輸出 N 次操作後的畫布狀態。
範例測資
範例輸入 | 範例輸出 |
---|---|
第一行輸入三個正整數 H、W、N (1 <= H、W <= 20,1 <= N <= 100)。 接下來有 N 行,每一行有四個整數 R、C、T、X (0 <= R <= H,0 <= C <= W,0 <= t <= 20,1 <= X <= 10)。 | 輸出畫布做 N 次畫筆操作後的狀態。 |
1 20 3 0 13 5 7 0 6 4 4 0 13 12 6 | 0 6 10 10 10 10 10 10 17 17 17 13 13 13 13 13 13 13 13 6 |
6 7 3 3 2 2 1 1 6 1 2 1 3 2 5 | 0 0 5 5 5 0 2 0 5 6 5 5 7 2 0 1 6 6 5 0 2 1 1 1 6 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 |
解題思路
使用 BFS 的方式來畫畫,終止條件除了當沒有起點時,當跑 BFS 的次數 >= T 時也要終止,曼哈頓距離其實就是走了幾步的意思,也就是 BFS 跑的次數。
在 BFS 的參數中需要有一個 map 來存取已經走過哪些點了,這邊取名叫做 all,如果 all[現在座標] == 0 才能給目前座標加上 X,並且每次走到任何座標都需要 all[座標]++,因為在同樣的第 N 次 BFS 中,同一個點只能被加一次 X,不能累加。
另外,為了避免超時,可以宣告一個 map 來存取下一次 BFS 已經有的起點,這邊取名叫做 add。當新增了下一次 BFS 的起點時,add[座標]++,並且要新增時需要判斷 add[座標] 是否為 0,如果是 0 才要新增這個座標。
範例程式碼-ZeroJudge O077: 電子畫布
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int H, W, N, num[30][30] = {}, loc[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int R, C, T, X;
pair<int, int> axis (const int a, const int b) {
pair<int, int>tmp;
tmp.first = a;
tmp.second = b;
return tmp;
}
void BFS(vector<pair<int, int>>start, map<pair<int, int>, int>MAP, const int time, map<pair<int, int>, int>all) {
if (time == T+1) return;
if (start.empty()) return;
vector<pair<int, int>>newStart;
map<pair<int, int>, int>add;
for (int i = 0; i<start.size(); i++) {
MAP[start[i]]++;
const int y = start[i].first, x = start[i].second;
if (all[start[i]] == 0) num[y][x] += X;
all[start[i]]++;
for (int j = 0; j<4; j++) {
const int yy = y + loc[j][0], xx = x + loc[j][1];
if (yy >= 0 && yy < H && xx >= 0 && x < W && MAP[axis(yy, xx)] == 0 && add[axis(yy, xx)] == 0) {
newStart.push_back(axis(yy, xx));
add[axis(yy, xx)]++;
}
}
}
BFS(newStart, MAP, time+1, all);
}
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
cin >> H >> W >> N;
for (int i = 0; i<H; i++) {
for (int j = 0; j<W; j++) num[i][j] = 0;
}
for (int i = 0; i<N; i++) {
cin >> R >> C >> T >> X;
vector<pair<int, int>>start;
start.push_back(axis(R, C));
map<pair<int, int>, int>MAP;
BFS(start, MAP, 0, MAP);
}
for (int i = 0; i<H; i++) {
for (int j = 0; j<W; j++) cout << num[i][j] << " ";
cout << "\n";
}
}
//ZeroJudge O077
//Dr. SeanXD