201409-4 最优配餐

实现

#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);

}
posted @ 2020-08-24 18:27  amonqsq  阅读(62)  评论(0编辑  收藏  举报