#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;
struct State
{
int x,y;
int layer;
State(int _x,int _y,int _l=0):x(_x),y(_y),layer(_l) {}
State()
{
x=y=layer=0;
}
};
int data[1000+5][1000+5]= {0};
//0 0/1 vis 1 0/1 client other clients needs;
std::queue<State> que;
int n,m,k,d,x,y,z;
long long ans;
void bfs();
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&d);
for(int i=0; i<m; i++) //分店
{
scanf("%d%d",&x,&y);
que.push(State(x,y));
}
for(int i=0; i<k; i++)
{
scanf("%d%d%d",&x,&y,&z);
data[x][y]=(data[x][y]|2)+(z<<2);
}
for(int i=0;i<d;i++)
{
scanf("%d%d",&x,&y);
data[x][y]|=1;
}
bfs();
return 0;
}
void bfs()
{
ans=0;
State tmp,cur;
while(!que.empty())
{
cur=que.front();que.pop();
int curx=cur.x,cury=cur.y,curl=cur.layer;
if(curx>0&&cury>0&&curx<=n&&cury<=n&&!(data[curx][cury]&1))
{
data[curx][cury]|=1;
que.push(State(curx+1,cury,curl+1));
que.push(State(curx,cury+1,curl+1));
que.push(State(curx-1,cury,curl+1));
que.push(State(curx,cury-1,curl+1));
if(data[curx][cury]&2)
ans+=(data[curx][cury]>>2)*curl;
}
}
cout<<ans;
//printf("%d",ans);
}
原文地址:http://blog.csdn.net/hikean/article/details/41897353