实现
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
#define MAX_MAP_SIZE 0x3ff
#define MAX_POINT_NUM 0xff000
struct point {
int x;
int y;
};
struct order_point {
int x,y;
int order_num;
};
int dx_dy[4][2] = {
{1,0},
{-1,0},
{0,1},
{0,-1}
};
int map[MAX_MAP_SIZE][MAX_MAP_SIZE];
bool visit[MAX_MAP_SIZE][MAX_MAP_SIZE];
queue<point> stores;
vector<order_point> customs;
int map_size, store_num, custom_num, stuck_num;
inline bool inRange(int x, int y) {
if (x >= 1 && x <= map_size
&& y >= 1 && y <= map_size) {
return true;
} else {
return false;
}
}
int main() {
scanf("%d%d%d%d", &map_size, &store_num, &custom_num, &stuck_num);
for (int i = 0;i < store_num;++i) {
point store;
scanf("%d%d", &store.x, &store.y);
stores.push(store);
visit[store.x][store.y] = true;
}
for (int i = 0;i < custom_num;++i) {
order_point custom;
scanf("%d%d%d",&custom.x,&custom.y,&custom.order_num);
customs.push_back(custom);
}
for (int i = 0;i < stuck_num;++i) {
int x_tmp, y_tmp;
scanf("%d%d", &x_tmp, &y_tmp);
map[x_tmp][y_tmp] = -1;
visit[x_tmp][y_tmp] = true;
}
while(!stores.empty()) {
point cur_point = stores.front();
stores.pop();
for(int i = 0;i < 4;++i) {
int cur_x = cur_point.x + dx_dy[i][0];
int cur_y = cur_point.y + dx_dy[i][1];
if (inRange(cur_x,cur_y)
&& !visit[cur_x][cur_y]
&& map[cur_x][cur_y] != -1) {
point point_tmp;
point_tmp.x = cur_x;
point_tmp.y = cur_y;
stores.push(point_tmp);
map[cur_x][cur_y] = map[cur_point.x][cur_point.y] + 1;
visit[cur_x][cur_y] = true;
}
}
}
long long res = 0;
for (int i = 0;i < customs.size();++i) {
res += map[customs[i].x][customs[i].y] * customs[i].order_num;
}
printf("%lld",res);
}